打字稿:赋值表达式中类型注释后的问号(可空类型?)

时间:2019-05-14 07:53:32

标签: typescript

今天我发现我可以这样做:

let foo: string? // foo now has type string | null

那是什么?我在TS手册中找不到它的参考。有人可以指出吗?

另一个(尽管同样重要)的问题是:为什么它会产生string | null而不是string | undefined?因为后者会更有用,因为已声明(但未初始化)的变量通常具有类型undefined。鉴于问题登录界面为我们提供了... | undefined类型,这更加令人困惑。

P.S。我的TS版本是3.4.3

UPD。看来是个错误。仅在后接if语句的情况下有效:

let foo: string?
if(1) {

}

那么,再次,这是一个错误,但是为什么会产生string | null

2 个答案:

答案 0 :(得分:1)

事实证明,this feature正在实施,并且在所有情况下,;之后需要?才能正常工作。

答案 1 :(得分:1)

看起来像这样是为了支持使用JSDoc的某些版本的TypeScript to check JavaScript files可空类型(即| null)表示法。如果您开始在TypeScript文件中使用JSDoc语法,那么我期望看到一个错误...这就是我在the Playground中看到的内容:

let foo: string?; // error!
// JSDoc types can only be used inside documentation comments.

如果您在TypeScript文件中使用该表示法而没有看到错误,我会认为这是一个错误(或者您可能设置了一些有趣的编译器选项)。


我之所以说“某个版本”,是因为将official JSDoc way的注释类型设为可空值是将?用作前缀运算符,而不是 postfix 运算符。也就是说,JSDoc表示使用@type {?string}而不是@type {string?}

显然,Google的Closure Compiler是非正式的supports postfix-?,我猜是TypeScript does too。但这不符合官方的JSDoc标准,甚至可能以being removed from TS结尾。因此,即使您在代码中使用JSDoc类型注释,我也不会依赖它。

好的,希望能有所帮助。祝你好运!