从文档和互联网上,我了解到像下面这样的代码会导致编译错误,因为 TypeScript 尝试推断 's' 的类型,将其视为 'any',但没有声明 's 的类型':
function fs(s){
console.log(s.substr(3));
}
但是,我很困惑为什么下一个代码片段不会导致错误:
let x;
如果我将鼠标悬停在“x”上,我会看到类型为“any”,但我没有在任何地方声明“x”的类型。此外,我可以执行以下操作:
let x;
x = 5;
x = "22";
x = {a: 1, b: 2};
仍然不会发生错误。 您能否澄清一下“noImplicitAny”在这种情况下的含义?
这似乎是 TS 2.1 中有意添加的。了解改进任何推理
早些时候
let x; // implicitly 'any'
let y = []; // implicitly 'any[]'
let z: any; // explicitly 'any'.
以上都会导致错误。但2.1之后,TS可以根据赋值推断类型。
let x;
// You can still assign anything you want to 'x'.
x = () => 42;
控制流分析的改进是PR#11263的一部分。 仅当 TS 无法找到变量的类型且没有任何类型注释时,才应报告隐式错误。
在您的示例中,
x
的类型非常简单。
这样想,上面的代码相当于:
let x = {a: 1, b: 2};
您希望这是一个错误吗?
虽然
x
的类型现在是 any,但只要您访问它,它就会推断出正确的类型。