为什么这段代码没有给我--noImplicitAny一个错误?

T.J*_*der 3 types typescript

tsc即使启用了该--noImplicitAny标志,此代码也不会显示TypeScript操场或from中的任何错误。为什么不?如果我将鼠标悬停methodName在操场上,它会说let methodName: any,所以好像是那种类型。而且我没有明确提供它,所以这是隐式的。

let methodName;
if (Math.random() < 0.5) {
    methodName = "foo";
} else {
    methodName = 42;
}
console.log(methodName);
Run Code Online (Sandbox Code Playgroud)

游乐场链接 (不幸的是,您必须手动进入“选项”并打开该选项,游乐场链接不会保留该选项)

当它没有给我一个错误时,我一半希望悬浮显示给我let methodName: string | number(这会让我想到:“哇,TypeScript的类型推断真的很深……”),但是它却说了any

即使仅靠let methodName;它本身也不会给我一个错误,但是我认为它基本上被忽略了,因为没有使用它,这就是为什么我有if/的原因else

export在它前面添加确实会给我Variable 'methodName' implicitly has an 'any' type.我所期望的错误,所以这可能表明某些原因。

Ali*_*deh 5

此PR引入了对let和var变量的控制流分析,这些变量没有类型注释,并且没有初始值或null或undefined的初始值。

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
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,x和y隐式具有任何声明的类型,但控制流分析可以在每个引用处确定其实际类型。因此,即使使用--noImplicitAny编译示例,也不会报告任何错误。

在某些情况下,控制流分析可能会及时地从嵌套函数中更准确地确定对外部变量的引用的类型,但是鉴于嵌套函数是可以任意传递和调用的第一类对象,因此有效无法分析所有此类情况。

摘自Anders Hejlsberg对此功能的解释