有人可以告诉我如何实现这种情况,例如
这样的代码let x;
会抛出一个异常并且不会发出它吗?我真的更喜欢2.1之前的TS版本的行为。也许TSlint可以解决我的问题?
答案 0 :(得分:0)
不同之处在于,当您分配给x
时,它会推断实际类型,而不仅仅是使用any
。在将号码分配给x
之前,它可能会显示为any
,但实际上尝试使用它时,您会发现它以undefined
类型开头。
它不显示在您的单行示例中,但在您分配给x
之前,您只能将其用作undefined
,并且在分配给它之后,类型会相应地加宽或更改。
考虑以下代码:
function foo(z: boolean) {
let x;
if (x) { // Editor sees the type here as `undefined`
x.foo(); // Error here, the type of `x` is now `never`
}
x = 3; // `x` now has type `number`
if (z) {
x = 'foo'; // `x` now has type `string`
}
let y = x; // Both `x` and `y` now have type `string|number`
console.log(y.toFixed()); // Error, `toFixed` does not exist on `string|number`
}
将定义更改为let x:any;
,此代码无需投诉即可编译,因为此处x
的类型确实为any
。
function foo(z: boolean) {
let x: any;
x = 3;
if (z) {
x = 'foo';
}
let y = x;
console.log(y.toFixed());
}
y
的类型明确any
,因为它是从x
的类型推断出来的。
所以回到你的一个班轮:
let x;
这不是隐式any
,因为推断类型为undefined
。
要回答这个问题,请不要关闭类型推理。