javascript - 为什么类型 'number' 不能分配给类型 'T'?

标签 javascript typescript

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/

相关文章:

javascript - 正则表达式 - 查找具有特定字符串的所有评论

javascript - 如何将变量从 html 传递到指令 AngularJS?

javascript - 为什么大家还在用render方法构建父 subview 呢?

javascript - Meteor JS 框架与 Google App Engine 兼容吗?

javascript - 转换为 map 对象

javascript - JQuery 使图像元素在可点击的 div 中不活动

typescript - 向 ionic2 项目中添加一个 js 库(尚未打字)

javascript - angular2 RC5 中 dynamicComponentLoader 的替代方案?

javascript - 如何将 html 字符串(html 标签)显示为文本区域中的内容?

javascript - 如何省略 0 和负数,但用户可以在 Angular Material 中输入例如 10