TypeScript 是不是有 Null 条件运算符

Posted

技术标签:

【中文标题】TypeScript 是不是有 Null 条件运算符【英文标题】:Does TypeScript have a Null-conditional operatorTypeScript 是否有 Null 条件运算符 【发布时间】:2018-01-08 12:19:06 【问题描述】:

有没有类似的运算符?在 TypeScript 中可以检查变量是否为 null 或未像 Kotlin 那样定义?喜欢

person?.getName()?.firstName ?: "None"

【问题讨论】:

据我所知,只有一个运算符告诉编译器一个值不会是 null: (person!.getName()) Does Typescript support the ?. operator? (And, what's it called?)的可能重复 是的。但我认为这个运算符仅适用于编译器,但不做任何检查。如果这个人在运行时为空,我想它会导致错误。对吗? 是的,你是对的。当我搜索?在打字稿中,*** 没有给出。抱歉重复。 html 中允许但在 TS 中不允许 【参考方案1】:

如果没有电子邮件,这会将item 设置为null

let item = user?.email;

【讨论】:

【参考方案2】:

它不仅在 typescript 中受支持(自版本 3.7.2 起)。 javascript 现在也支持它(从 ES2020 开始)。

实际上,这意味着您可以在 Angular 等框架中使用它 (since v9 which supports typescript 3.7)。

但尤其是现在 它在 ES2020 规范中,我们将看到它 无处不在。

【讨论】:

【参考方案3】:

真正好的答案在Andreas'评论中。从 Typescript 3.7 开始,您的示例将按如下方式实现:

person?.getName()?.firstName ?? "None"

见https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#nullish-coalescing

【讨论】:

【参考方案4】:

是的,从 Typescript 3.7 开始,您现在可以通过 optional-chaining 执行此操作

person?.getName()?.firstName

被转译为

let firstName = person === null || person === void 0 ? void 0 : (_person$getName = person.getName()) === null || _person$getName === void 0 ? void 0 : _person$getName.firstName;

注意检查是否为空。如果例如将人定义为

,这将按预期工作
let person:any = null; //no runtime TypeError when calling person?.getName()

但是如果人被定义为

let person:any = ;//Uncaught TypeError: person.getName is not a function

另见similar *** question

【讨论】:

同样,nullish coalescing operator 从 TS 3.7 开始也存在:let x = foo ?? bar();【参考方案5】:

我在我的代码中使用它来检查 null

this.firstname = (this.firstname != null) ? this.firstname : this.firstname;

在 v3 发布之前可以这样做

【讨论】:

【参考方案6】:

我遇到了同样的情况,以下对我有用。

首先,我定义了一个单独的类,其属性可以是null

export class Foo 
    id: number; //this can be null

然后在我的主类中,我将属性foo 设置为这个新类型:

foo: Foo

之后,我就可以这样使用它了:

var fooId = (this.foo || ( as Foo)).id;

这是我在当前版本的 TypeScript 中最接近空传播的方法。

【讨论】:

【参考方案7】:

实际上这与this answer 中提到的javascript null 安全discussion 有关。我猜他们希望在使用 typescript 之前在 javascript 上支持它。

【讨论】:

【参考方案8】:

不,到目前为止,Typescript 中仍未实现安全导航操作符: https://github.com/Microsoft/TypeScript/issues/16

但是根据最新的标准化会议记录,它已经提出,所以可能是 v3 :)

https://github.com/tc39/agendas/blob/master/2017/07.md

【讨论】:

谢谢。我浏览了手册,但没有找到任何东西。我认为这个操作符既有用又漂亮,消除了很多垃圾代码。你知道这个算子未来是否会被纳入 ES 标准吗? 作为旁注打字稿确实有? 运算符,但没有这样做。 对于任何寻找的人,这里是related javascript proposal。 所以也许 v3 v3 已经出局了,也许这个答案需要更新(即使只是说如果是这种情况它不被接受 我正在使用 Typescript v3.7.2 但仍未找到此功能。有人可以帮忙吗?

以上是关于TypeScript 是不是有 Null 条件运算符的主要内容,如果未能解决你的问题,请参考以下文章

带和不带 () 的条件运算符

null合并运算符??和null条件运算符?.

TypeScript 运算符

C#NULL条件运算符

TypeScript的初认识

TypeScript的初认识