泛型数组的类型推断为什么不起作用?
第7行写了个泛型T,限定数组元素的类型必须统一。第11行传递的数组元素类型分别是数字、字符串,类型并不统一,按理说 typescript 应该会报错的,这里为什么不报错呢?
//例1
function add<T>(a: T, b: T) {
return `${a} ${b}`;
}
console.log(add(888, 'y')); //类型推断的结果会指出代码哪儿有错
//例2
function join<T>(arr: T[]) {
return arr.join(' ');
}
console.log(join([1, 'y'])); //类型推断的结果认为代码写的没问题
typescript的类型推断,不应该包括联合类型的!如果依据第11行的[1, 'y']
就推导出第7行的 T 是 number|string,那修改第11行的数组,变成[1, 'y', {}, true, undefined]
势必推导出第7行的 T 是 number|string|object|boolean|undefined……继续下去不就成了 any 类型?
这种情况为什么不能象例1那样给出错误提示呢?例1为什么就不会推导成 any 类型呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
并不会啊 这时候推断出的T不是 Array<string | number>吗
function join<T>(arr: T[])
并不是限定入参数组必须类型一致,而是说数组元素必须都是 T 类型,T可以是任意类型,当然也可以是 union type。否则下面的代码怎么要报错么?显然你不能给我报错。
而你使用的时候选择了自行推导,则意味着,你让 ts 替你从实参 [1, 'y'] 推导出 T 应该是什么类型,只有无法推导才会报错。而事实是它能成功推导出 T 是 number | string ,这不是恰恰说明了推导起作用了么?