【问题标题】:typescript --strictNullChecks vs. flow's null checkingtypescript --strictNullChecks 与流的空值检查
【发布时间】:2016-03-23 12:38:09
【问题描述】:

如果我在下面的代码上运行“typescript --strictNullChecks”,我不会收到任何错误。如果我运行它,它会给我一个关于 null 与数字的类型不兼容的错误。为什么打字稿也不会出错?这是值得记录的功能或问题吗?

// @flow
var f = function f( x ) {
    var y = x * 2;
}
f(null);

【问题讨论】:

    标签: typescript


    【解决方案1】:

    TypeScript 不进行调用站点分析。

    TypeScript 看到这个,没关系:

    var f = function f( x: any ) {
        var y = x * 2;
    }
    f(null);
    

    流程看到:

    var f = function f( x: ??? ) {
        var y = x * 2;
    }
    f(null);
    

    其中??? 是通过查看当前文件中的调用来确定的。在这种情况下,x 具有裸类型 null 并且是错误的。

    为什么 TypeScript 不从调用站点推断类型?一般来说,计算机可以由此生成的错误消息是模糊的——您在 Flow 中经常看到的是您将错误类型的参数传递给函数,在 bodybody正确实现的函数(或下游函数),然后必须向后工作以查看有问题的参数的来源。有时这并不清楚——如果你的一半代码写了fileName,一半的代码写了filename,并且你传递了这些对象的混合,谁能说谁不正确? TypeScript 的答案是“放一个类型注释来解释你的意图”,这样你就可以得到高特异性的错误。

    而且由于这种分析成本更高,因此不太适合整个程序分析。因此 Flow 仅在每个文件的基础上进行这种推断,这意味着您通常希望在文件的“边界”以及与之交互的文件的每个函数上都有类型注释。而且由于这些边界是大多数错误所在的地方,因此它并不总是像乍看之下那样为您买单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2020-03-11
      • 1970-01-01
      • 2020-04-05
      • 2019-12-11
      相关资源
      最近更新 更多