Typescript - 可选类型

13
如何在Typescript中使用可选类型?例如,我有一个名为Conversation的对象:
class Conversation {
    lastMessage?: Message
}

class Message {
    text: string
}

我想通过Conversation对象从Message对象中获取可空的text

const lastMessageText?: string = conversation?.lastMessage.text

但是这种语法无法奏效。我无法在对话之后写 ?


2
类似于 https://dev59.com/elcO5IYBdhLWcg3wXgfh#45922773 - Titian Cernicova-Dragomir
2个回答

8

TypeScript 3.7 开始,optional chaining 可用。

3.7 的发布说明在此处。


4
有一个提议要将?.运算符添加到JavaScript中,但它没有在规范进程中进展得足够远,因此在Typescript中尚不能实现(由于Typescript希望保持JavaScript的超集,团队通常不会在最终阶段之前添加建议的功能)。
您可以使用&&运算符来实现类似的效果,但更冗长:
const conversation: Conversation = {

}
const lastMessageText = conversation.lastMessage && conversation.lastMessage.text // is of type string| undefined

编辑

目前,可选链 JavaScript 功能尚未达到第三阶段,当涉及到表达式级别语法时,TypeScript 仅支持处于第三阶段的 JS 提案(在处理类型时,它们会自行处理)。从 最新的 GitHub 问题 请求可选链:

由于多次将功能添加到 TS 中,最后一刻语义被撤回,我们已经受够了。无论有多少票数,我们都不会添加可能会在将来大大改变运行时行为的功能。


2
参见: https://github.com/tc39/proposal-optional-chaining 和 https://github.com/Microsoft/TypeScript/issues/16 - Paleo
我觉得这并没有真正回答问题,问题是关于 TypeScript 而不是 JavaScript。当然,TypeScript 会被转译成 JavaScript,但它们仍然是不同的东西。 - roberto tomás
@robertotomás 这是缺乏支持的官方原因,TS 尽量不在 JS 语法中添加太多内容,当涉及到表达式级别的语法时,他们通常只会添加 JS 中已有或即将有的内容(即已提议并处于第三阶段),我很快会在 GitHub 上添加一个参考。 - Titian Cernicova-Dragomir
@robertotomás 添加了一份官方参考,说明为什么在这种情况下缺乏JS支持对TS是一个问题。希望这能澄清问题,请告诉我您的想法。 - Titian Cernicova-Dragomir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接