function say3<T>(a: T): T {
return a + 1;
}
let speak = say3<number>(1)
我尝试了演示,但它说“类型‘数字’不可分配给类型‘T’。” 这不是数字吗?
最佳答案
这里的问题在于操作+ 1
。 Typescript 无法确定您是在进行数字求和、字符串连接还是 BigInt
操作。事实上,因为 T 类型变量(其中 T 是任何可能的类型)加 1 的结果没有明确定义,甚至可能返回与 T 不同的类型!我想到的一个特殊情况是 []+1=="1"
或 {}+1==1
,其中 T
是一个 Array
和一个 Object
而该函数将分别返回一个 string
或一个 number
。
当您对函数进行模板化时,无论可能的 T 类型如何,都需要很好地定义函数。换句话说,是的,T
不是一个数字,即使您稍后明确传递一个数字也是如此。
一个可能的解决方法是明确确定返回类型是一个数字并限制 T:
function say3<T extends number>(a: T): number {
return a + 1;
}
let speak = say3<number>(1)
或者如果你真的想让 T 与其他类型一起工作,你可以进行运算符重载:
function say3(a: string): string
function say3(a: number): number
function say3(a: any[]): string
function say3(a: object): number
function say3(a: null): number
function say3(a: undefined): number
function say3(a: any) {
return a+1;
}
let speak = say3(1)
无论哪种方式,您都不能对未定义的类型调用运算符。
关于javascript - 为什么类型 'number' 不能分配给类型 'T'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53511050/