【发布时间】:2016-03-23 12:38:09
【问题描述】:
如果我在下面的代码上运行“typescript --strictNullChecks”,我不会收到任何错误。如果我运行它,它会给我一个关于 null 与数字的类型不兼容的错误。为什么打字稿也不会出错?这是值得记录的功能或问题吗?
// @flow
var f = function f( x ) {
var y = x * 2;
}
f(null);
【问题讨论】:
标签: typescript
如果我在下面的代码上运行“typescript --strictNullChecks”,我不会收到任何错误。如果我运行它,它会给我一个关于 null 与数字的类型不兼容的错误。为什么打字稿也不会出错?这是值得记录的功能或问题吗?
// @flow
var f = function f( x ) {
var y = x * 2;
}
f(null);
【问题讨论】:
标签: typescript
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 中经常看到的是您将错误类型的参数传递给函数,在 body 的 body正确实现的函数(或下游函数),然后必须向后工作以查看有问题的参数的来源。有时这并不清楚——如果你的一半代码写了fileName,一半的代码写了filename,并且你传递了这些对象的混合,谁能说谁不正确? TypeScript 的答案是“放一个类型注释来解释你的意图”,这样你就可以得到高特异性的错误。
而且由于这种分析成本更高,因此不太适合整个程序分析。因此 Flow 仅在每个文件的基础上进行这种推断,这意味着您通常希望在文件的“边界”以及与之交互的文件的每个函数上都有类型注释。而且由于这些边界是大多数错误所在的地方,因此它并不总是像乍看之下那样为您买单。
【讨论】: