在函数调用中使用类型变量时出错

时间:2019-05-17 19:35:37

标签: javascript typescript

我正试图了解type variables for funcitons。该示例仅使用一个,但我尝试将其扩展为两个。各种输入会产生我不理解的输出。

function id<T, U>(arg1, arg2: U): U{ // error 1 below
  // return arg2 + arg2; // when uncommented, error 2 below 
  return arg2 * 2
      // ^--^ error 3 below
//^-------------^ error 4 below
}

var result = id<string, number>('lorem', 10)

错误1

  

Parameter 'arg1' implicitly has an 'any' type.

错误2

  

error Operator '+' cannot be applied to types 'U' and 'U'.

错误3

  

The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.

错误4

  

Type 'number' is not assignable to type 'U'.

我在几个方面感到困惑,所以请随时提出以下建议:

1:不使用<string, number>指定参数类型向被调用函数注册,这些是所提供参数的类型。为什么需要在参数列表中再次给出: T

2:U这里应该是一个数字,为​​什么我不能加上它?

3:我不明白此错误的真正根源。

4:如果我不带乘法就简单地返回arg2,则此方法有效。我不明白为什么我不能在这里返回数字。

3 个答案:

答案 0 :(得分:1)

第一个错误告诉您,应该始终将类型添加到参数中。 arg1当前未键入。

其他错误告诉您:

您只能加(+)个数字和字符串,而不能加所有内容(例如对象)。这就是为什么必须将通用U缩小为字符串或数字的原因。

您只能将数字(*)和BigInts相乘。

这里的要点是:该功能必须在任何可能的情况下都可以正常工作。

答案 1 :(得分:0)

  

1:不使用注册到指定参数类型   这些是提供的参数类型的调用函数。   这些需求为何如此:需要在参数中再次给出T   清单?

函数声明中的类型不与其参数映射为1:1。如果您希望arg1的类型为U,则需要指定它。

  

2:U在这里应该只是一个数字,为​​什么我不能加上它?

     

3:我不明白此错误的真正根源。

     

4:如果我不带乘法就简单地返回arg2,则此方法有效。一世   不明白为什么我不能在这里返回数字。

只需告诉TypeScript U是一个数字:<T, U extends number>

还要注意,在这种情况下,编译器可以确定函数的返回类型,因此可以忽略它。我想您想结束这样的事情:

function id<T, U extends number>(arg1: T, arg2: U) {
 return arg2 * 2;
}

答案 2 :(得分:0)

  1. TypeScript不是JS。一般来说,它更严格。
  2. TypeScript在配置方面没有约定,您可以使用3个或更多参数。所以您应该显式设置参数类型;
  3. TS中没有运算符重载语法支持(就像我们在C#中一样)。 但是,支持类型参数约束。所以你可以写
""

在您的函数内部使用SomeClass道具。并且您可以编写“ U扩展数”以支持加/减运算。您还可以使用对象的valueOf函数(由js在后台使用)并将arg2强制转换为“ any”(如果您的参数已为数字,则无需使用valueOf):

function id<T, U extends SomeClass>(...) 
  1. 如果您想使用数字-只需使用数字,或使用您的特定API(使用接口)