【问题标题】:Optional Chaining Operator in Typescript打字稿中的可选链接运算符
【发布时间】:2017-08-23 15:20:02
【问题描述】:

在 javascript 中,babel plugin 支持可选链接运算符。

但我在 Typescript 中找不到如何执行此操作。有什么想法吗?

【问题讨论】:

  • TypeScript 不支持可选链操作符
  • (((一些 || {}).variable || {}).access || {}).nested
  • optional chaining 现在处于第 2 阶段!因此更有可能将其添加到 javascript 并最终添加到 typescript 中。

标签: javascript typescript optional chaining


【解决方案1】:

在撰写本文时,TypeScript 不支持可选链接运算符。请参阅关于 TypeScript 问题跟踪器的讨论:https://github.com/Microsoft/TypeScript/issues/16

作为警告,这个运算符的语义仍然非常在不断变化,这就是 TypeScript 尚未添加它的原因。今天针对 Babel 插件编写的代码可能会在没有警告的情况下改变未来的行为,从而导致困难的错误。我通常建议人们不要开始使用行为尚未明确定义的语法。

【讨论】:

  • 我很抱歉,但我真的很好奇,“user.address?.street”之类的语法怎么会在这一点上真正改变?在检查街道之前,您有一个问号来检查地址是否不为空。当然,也许一些幕后代码可能会改变,但对于实现这一点的用户 - 会出现什么问题?无意冒犯,我只是很好奇
  • 一年后有什么消息吗?
  • TC39 委员会仍在争论语法和行为
  • 如果您有兴趣,我会在这里提一下——现在有一些实用程序 functions 试图提供类型安全的替代方案,例如 typesafe-getoptional-chain和(我的)get-optional。当然,它们都与原生支持的运算符不同,但无论如何它们都会有所帮助。
  • 你必须考虑这样的情况,你说“哦,我们所有的运行时都支持我们正在使用的所有语法特性,所以我们可以关闭降级”,你最终会得到不同的行为
【解决方案2】:

2019 年 10 月 15 日更新

现在支持typescript@3.7.0-beta

感谢https://stackoverflow.com/a/58221278/6502003 的更新!


尽管 TypeScript 和社区支持此运算符,但在 TC39 巩固 current proposal在撰写本文时它位于 stage 1)之前,我们将不得不使用替代方案。

有一种替代方法可以在不牺牲开发工具的情况下接近可选链接https://github.com/rimeto/ts-optchain

This article 记录了创建者在尝试镜像本地链接运算符时能够实现的目标:

  1. 使用与链式属性访问密切相关的语法
  2. 在遍历失败时提供默认值的简明表达式
  3. 启用 IDE 代码完成工具和编译时路径验证

实际上它看起来像这样:

import { oc } from 'ts-optchain';

// Each of the following pairs are equivalent in result.
oc(x).a();
x && x.a;

oc(x).b.d('Default');
x && x.b && x.b.d || 'Default';

oc(x).c[100].u.v(1234);
x && x.c && x.c[100] && x.c[100].u && x.c[100].u.v || 1234;

请记住,一旦提案被 TypeScript 采纳,类似这样的替代方案可能就没有必要了。

另外,非常感谢 Ryan Cavanaugh 为您在 TC39 中倡导该运营商所做的所有工作!

【讨论】:

  • 如果您想修复使用 typescript 的 VS Code linting,作为奖励,请使用 "typescript.tsdk": "${npm global dir}/lib/node_modules/typescript/lib" 指向 settings.json 中的 typescript v >= 3.7.0-beta
【解决方案3】:

Typescript 3.7 beta has now support for Optional chaining??

您现在可以编写如下代码:

let x = foo?.bar?.baz;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-25
    • 2021-07-23
    • 2019-01-15
    • 2021-10-10
    • 1970-01-01
    • 2023-02-25
    • 2023-03-07
    • 2016-03-14
    相关资源
    最近更新 更多