即使启用了tsc
标志,此代码也不会显示TypeScript操场或--noImplicitAny
中的任何错误。为什么不?如果我将methodName
悬停在操场上,它会说let methodName: any
,所以好像是这种类型。而且我没有明确提供它,所以这是隐式的。
let methodName;
if (Math.random() < 0.5) {
methodName = "foo";
} else {
methodName = 42;
}
console.log(methodName);
Playground link (很遗憾,您必须手动进入“选项”并打开该选项,游乐场链接不会保留这些选项)
当它没有给我带来错误时,我一半希望将鼠标悬停在显示let methodName: string | number
的位置上(这会让我想到:“哇,TypeScript的类型推断真的很深……”),但是说any
。
即使仅靠let methodName;
也不会给我一个错误,但是我认为它基本上被忽略了,因为没有使用它,这就是为什么我有if
/ { {1}}。
在其前面添加else
确实会给我带来我所期望的export
错误,所以这可能表明某些原因。
答案 0 :(得分:3)
此PR介绍了let和var变量的控制流分析 没有类型注释,也没有初始值或初始值 值为null或未定义。
function f(cond: boolean) { let x; if (cond) { x = "hello"; x; // string } else { x = 123; x; // number } return x; // string | number } function g(cond: boolean) { let y = null; if (cond) { y = "hello"; } return y; // string | null }
在上面的示例中,x和y隐式声明了any的类型 但是控制流分析可以确定每种情况下的实际类型 参考。因此,即使该示例是 用--noImplicitAny编译。
及时地进行控制流分析将可能 从中准确确定对外部变量的引用类型 嵌套函数在某些情况下,但考虑到嵌套函数是 可以随意传递和调用的一流对象, 实际上不可能分析所有这些情况。
Copied from explanation given on this feature by Anders Hejlsberg