今天我发现我可以这样做:
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
?
答案 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类型注释,我也不会依赖它。
好的,希望能有所帮助。祝你好运!