打字稿泛型。类型系统中断的简单情况

时间:2019-07-02 11:07:26

标签: typescript

TypeScript为什么接受以下代码:

export let repeat = <a> (a: a, n: number): Array<a> => {
  return [...Array(n).fill(a), 1] // <-- no error here (but should)
  // return [...[a], 1] // <-- an error here (as should)
}

console.log(repeat("x", 4))

tsconfig.json

"strict": true,
...

添加, 1]来检查大小写。这并不是要成为repeat逻辑的一部分。

1 个答案:

答案 0 :(得分:1)

问题是您在使用any[]时引入了Array(n)Array(n)将返回一个any[],因此无论您在数组中放入什么内容,数组展开的结果也将是any[]。根据定义,any可分配给任何包含通用类型参数的东西,因此分配成功。

使用通用构造函数,您将得到预期的错误:

export let repeat = <a> (a: a, n: number): Array<a> => {
  return [...new Array<a>(n).fill(a), 1] // <-- error now
}

您还可以考虑启用tslint规则no-unsafe-any,这可能会引起这一问题。