泛型数组的类型推断为什么不起作用?

发布于 2022-09-12 13:19:35 字数 674 浏览 38 评论 0

image.png
第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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

心如狂蝶 2022-09-19 13:19:35

并不会啊 这时候推断出的T不是 Array<string | number>吗

忆梦 2022-09-19 13:19:35

function join<T>(arr: T[]) 并不是限定入参数组必须类型一致,而是说数组元素必须都是 T 类型,T可以是任意类型,当然也可以是 union type。否则下面的代码怎么要报错么?

type A = string | number;
const arr:A[] = [1, 'y'];
join<A>(arr); 

显然你不能给我报错。

而你使用的时候选择了自行推导,则意味着,你让 ts 替你从实参 [1, 'y'] 推导出 T 应该是什么类型,只有无法推导才会报错。而事实是它能成功推导出 T 是 number | string ,这不是恰恰说明了推导起作用了么?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文