具有基于另一个参数的默认参数的函数

d_invitable

鉴于此JavaScript函数:

function foo({ a, b, c = a + b }) {
  return c * 2;
}

当我尝试用打字稿中的类型注释它时:

function foo({ a, b, c = a + b }: { a?: number, b?: number, c: number }): number {
  return c * 2;
}

我得到错误:TS2532 Object is possibly undefined这很有意义,因为我还没有告诉过它,a并且bc未指定时不是可选的

但是,任何尝试指定此方法均无效:

  1. 重载(1):
function foo({ a, b, c = a + b }: { a: number; b: number; c: number }): number;
function foo({ c }: { c: number }): number {
  return c * 2;
}

TS2371: A parameter initializer is only allowed in a function or constructor implementation.

  1. 重载(2):
function foo({ c }: { c: number }): number;
function foo({ a, b, c = a + b }: { a: number; b: number; c: number }): number {
  return c * 2;
}

TS2394: This overload signature is not compatible with its implementation signature.

这对我来说没有意义,我看不出为什么TypeScript认为它们不兼容。

  1. 有条件的
function foo({
  a,
  b,
  c = a + b,
}: {
  a: typeof c extends number ? void : number;
  b: typeof c extends number ? void : number;
  c: typeof a extends number ? void : typeof b extends number ? void : number;
}): number {
  return c * 2;
}

TS2502: 'a' is referenced directly or indirectly in its own type annotation. TS2502: 'c' is referenced directly or indirectly in its own type annotation.

鉴于TypeScript无法解决递归问题,这是有道理的。

有谁知道如何将此功能强类型化?

注意:我非常清楚您可以将原型本身更改为具有不同的参数结构,但是这样做会失败。

杰罗姆布

这是一个使用联合类型的命题:

type AB_Defined = {
    a: number,
    b: number,
    c?: number,
}

type AB_Nullable = {
    a?: never,
    b?: never,
    c: number,
}

type FunctionParams = AB_Defined | AB_Nullable

// here I need to cheat using a! and b! to tell it cannot be undefined
function foo({ a, b, c = a! + b! }: FunctionParams) {
  return c * 2;
}

foo({ a: 3, b: 2  });

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从具有参数的另一个函数中调用带有参数的函数?

来自分类Dev

如何传递具有参数作为另一个函数的参数的函数指针?

来自分类Dev

具有Rest参数的TypeScript调用函数与具有Rest参数的另一个函数

来自分类Dev

调用另一个函数内具有参数类型的函数c#

来自分类Dev

将具有不同数量参数的函数传递给另一个函数C ++

来自分类Dev

使用具有另一个函数作为参数的函数:

来自分类Dev

将具有任意数量参数的任何函数传递给另一个函数

来自分类Dev

调用另一个函数内具有参数类型的函数c#

来自分类Dev

调用另一个函数并有选择地保留默认参数

来自分类Dev

如何在打字稿中将参数从一个具有可变参数的函数传递到另一个具有可变参数的函数?

来自分类Dev

具有所有默认参数的显式构造函数不能从同一类的另一个构造函数调用

来自分类Dev

具有可变数量和参数类型的C ++函数作为另一个函数的参数

来自分类Dev

具有一个默认参数和一个变量参数的C ++构造函数

来自分类Dev

函数参数的默认值等于另一个参数

来自分类Dev

Python可选函数参数默认为另一个参数的值

来自分类Dev

默认的LESS函数参数最初设置为另一个参数吗?

来自分类Dev

在另一个带有点参数和默认值的函数中调用带有点参数和默认值的函数

来自分类Dev

带有参数的循环函数在另一个带有参数的循环函数中

来自分类Dev

如何从具有可选第三个参数的另一个函数调用函数?

来自分类Dev

基于另一个参数约束参数类型的最有效方法

来自分类Dev

返回具有多个输入参数的函数的值以在同一类中具有多个参数的另一个函数中使用?

来自分类Dev

覆盖另一个函数调用的函数中的默认参数

来自分类Dev

我如何将异步函数用作另一个函数的默认参数

来自分类Dev

从C ++ 17中的另一个构造函数调用具有不同参数类型的构造函数

来自分类Dev

从python字典调用具有多个参数的函数名到另一个函数

来自分类Dev

Kotlin使用另一个对象作为默认构造函数参数创建新对象

来自分类Dev

如何将参数传递给另一个具有相同名称的内部函数?

来自分类Dev

PHP函数作为另一个函数的参数

来自分类Dev

函数参数作为另一个函数的名称?

Related 相关文章

  1. 1

    如何从具有参数的另一个函数中调用带有参数的函数?

  2. 2

    如何传递具有参数作为另一个函数的参数的函数指针?

  3. 3

    具有Rest参数的TypeScript调用函数与具有Rest参数的另一个函数

  4. 4

    调用另一个函数内具有参数类型的函数c#

  5. 5

    将具有不同数量参数的函数传递给另一个函数C ++

  6. 6

    使用具有另一个函数作为参数的函数:

  7. 7

    将具有任意数量参数的任何函数传递给另一个函数

  8. 8

    调用另一个函数内具有参数类型的函数c#

  9. 9

    调用另一个函数并有选择地保留默认参数

  10. 10

    如何在打字稿中将参数从一个具有可变参数的函数传递到另一个具有可变参数的函数?

  11. 11

    具有所有默认参数的显式构造函数不能从同一类的另一个构造函数调用

  12. 12

    具有可变数量和参数类型的C ++函数作为另一个函数的参数

  13. 13

    具有一个默认参数和一个变量参数的C ++构造函数

  14. 14

    函数参数的默认值等于另一个参数

  15. 15

    Python可选函数参数默认为另一个参数的值

  16. 16

    默认的LESS函数参数最初设置为另一个参数吗?

  17. 17

    在另一个带有点参数和默认值的函数中调用带有点参数和默认值的函数

  18. 18

    带有参数的循环函数在另一个带有参数的循环函数中

  19. 19

    如何从具有可选第三个参数的另一个函数调用函数?

  20. 20

    基于另一个参数约束参数类型的最有效方法

  21. 21

    返回具有多个输入参数的函数的值以在同一类中具有多个参数的另一个函数中使用?

  22. 22

    覆盖另一个函数调用的函数中的默认参数

  23. 23

    我如何将异步函数用作另一个函数的默认参数

  24. 24

    从C ++ 17中的另一个构造函数调用具有不同参数类型的构造函数

  25. 25

    从python字典调用具有多个参数的函数名到另一个函数

  26. 26

    Kotlin使用另一个对象作为默认构造函数参数创建新对象

  27. 27

    如何将参数传递给另一个具有相同名称的内部函数?

  28. 28

    PHP函数作为另一个函数的参数

  29. 29

    函数参数作为另一个函数的名称?

热门标签

归档