function say3<T>(a: T): T {
return a + 1;
}
let speak = say3<number>(1)
我尝试了该演示,但是它说“类型'number'不能分配给类型'T'。 T不是数字吗?
答案 0 :(得分:3)
此处的问题与操作+ 1
有关。 Typescript无法确定您是在进行数字求和,字符串连接还是BigInt
操作。实际上,因为类型T(其中T是任何可能的类型)加1的变量的结果没有很好地定义,甚至可能返回与T不同的类型!我想到的一个特殊情况是[]+1=="1"
或{}+1==1
,其中T
是Array
和Object
的情况,而函数将返回{{1 }}或string
。
在对函数进行模板化时,无论可能的T类型如何,都需要对函数进行良好的定义。换句话说,number
不是数字,即使您稍后明确地传递数字也是如此。
一种可能的解决方法是显式确定返回类型为数字并限制T:
T
或者如果您真的希望T与其他类型一起使用,则可以执行运算符重载:
function say3<T extends number>(a: T): number {
return a + 1;
}
let speak = say3<number>(1)
无论哪种方式,您都不能通过未定义的类型调用运算符。