我刚刚开始使用 TypeScript。
有这样的代码
let arr : number[] | number = [1, 2, 3];
function logOut(arr: number[]) : void {
arr.forEach((item) => {
console.log(item);
});
}
logOut(arr);
变量arr
可以是数字或数字数组。我明确地将它设置为一个数字数组。
该函数logOut
将一个数字数组作为其唯一参数。
现在一切正常,没有错误,代码运行没有问题。
我更改了代码,添加了条件覆盖arr
:在 50% 的情况下arr
,它将变得相等100
而不是[1, 2, 3]
let arr : number[] | number = [1, 2, 3];
arr = Math.random() > 0.5 ? arr : 100;
function logOut(arr: number[]) : void {
arr.forEach((item) => {
console.log(item);
});
}
logOut(arr);
这在 variable 的情况下非常适合编译器arr
,因为它明确指出它可以是一个数字数组和一个数字,但这不适合 function logOut
,因为它只接受一个数字数组作为输入。而且,正确地,TypeScript Playground 中的函数调用行以红色突出显示。
因此问题是:在不添加任何运行时检查的情况下,编译器如何知道调用函数时可能会发生错误?他是如何从仅添加的一行中弄清楚的?它有这么强大的静态分析仪吗?Math.random()
让它打开“高度警惕模式”?在不太明显的情况下会发生什么,如果我不小心编写了这样的代码,其中变量将在运行时更改其类型?TypeScript 是否以某种方式神奇地提供了所有可能的选项?
为表达式
Math.random() > 0.5 ? arr : 100;
计算返回类型在这种情况下,它将是
number[] | number
,它对应于先前声明的变量的类型,因此可以将结果存储在其中。接下来是一个简单的检查变量
number[] | number
的类型是否比参数的类型宽number[]
。由于编译器无法准确说明传递时它将是什么类型,因此会引发指示的错误。