TypeScript可以警告我非空断言运算符的多余用法吗?

时间:2017-01-03 22:47:26

标签: typescript

考虑以下TypeScript代码:

let x = { foo: { bar: "baz" } };
console.log(x.foo!.bar);

此处,x.foo的推断类型为{ bar: string },因此不需要使用非空断言运算符!(请参阅例如https://github.com/Microsoft/TypeScript/issues/7395 ):编译器已经知道x.foo不能为空。

tsc(或可能是广泛使用的第三方工具,如TSLint)警告我!的这些多余用途,和/或这是一个计划的功能吗?

我确信这在原则上是可行的(似乎只是使用TypeScript编译器API来识别!用于类型不是T | null的变量的地方或T | undefined);我只是想知道是否已经完成了繁重的工作。或者,我想,指向TypeScript编译器API的相关部分的指针也会起作用 - 很难找到它的文档(我想因为它还不稳定)。

(我问的原因是我担心我最终不得不处理那些过去我的代码一些白痴撒谎!无处不在tsc --strictNullChecks 1}}停止发出错误,而不是实际考虑在运行时实际 是否的断言变量。如果它在运行时最终为null,瞧!我们可能已经抓到的一个bug在编译时,但不是因为过分热心的!! s已经知道非空的变量会强烈暗示代码过度使用!,很可能不正确。)

2 个答案:

答案 0 :(得分:3)

TSLint现在通过no-unnecessary-type-assertion rule执行此操作。

这样的代码:

const x: string = "foo";
const y = x!.indexOf("f"); // <-- x is of type string; no need to assert non-null

将触发如下警告:

This assertion is unnecessary since it does not change the type of the expression.

答案 1 :(得分:0)

不,它现在看起来不像。为了进入编译器代码库,我在我的分支上这样做了:https://github.com/Sheeo/TypeScript/commit/e6d1651e4d28493b6e5f20d027ad8e86f7451552

您可以通过克隆repo并使用该版本的编译器来运行它 - 记得启用strictNullChecks:)