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

时间:2019-04-07 10:59:00

标签: typescript types

即使启用了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错误,所以这可能表明某些原因。

1 个答案:

答案 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