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
逻辑的一部分。
答案 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
,这可能会引起这一问题。