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

zhaiduting
  • 1
新手上路,请多包涵

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 类型呢?

评论
阅读 285
2 个回答

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

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 ,这不是恰恰说明了推导起作用了么?

撰写回答

登录后参与交流、获取后续更新提醒

宣传栏