为什么“数字”类型不能分配给“ T”类型?

时间:2018-11-28 02:06:42

标签: javascript typescript

function say3<T>(a: T): T { 
    return a + 1; 
} 
let speak = say3<number>(1)

我尝试了该演示,但是它说“类型'number'不能分配给类型'T'。 T不是数字吗?

1 个答案:

答案 0 :(得分:3)

此处的问题与操作+ 1有关。 Typescript无法确定您是在进行数字求和,字符串连接还是BigInt操作。实际上,因为类型T(其中T是任何可能的类型)加1的变量的结果没有很好地定义,甚至可能返回与T不同的类型!我想到的一个特殊情况是[]+1=="1"{}+1==1,其中TArrayObject的情况,而函数将返回{{1 }}或string

在对函数进行模板化时,无论可能的T类型如何,都需要对函数进行良好的定义。换句话说,number不是数字,即使您稍后明确地传递数字也是如此。

一种可能的解决方法是显式确定返回类型为数字并限制T:

T

或者如果您真的希望T与其他类型一起使用,则可以执行运算符重载:

function say3<T extends number>(a: T): number {
  return a + 1;
}
let speak = say3<number>(1)

无论哪种方式,您都不能通过未定义的类型调用运算符。