typescript - 打字稿:组合类型上不存在属性?
问题描述
以下抽象的 TS 场景:
interface EmotionsOkay {
emotion: string;
okay: "yap";
}
interface EmotionsNotOkay {
emotion: string;
}
type UndetereminedEmotion = EmotionsOkay | EmotionsNotOkay;
const areYouOkay = (test: UndetereminedEmotion) => {
console.log(test.okay ? "happy :D" : "sad D:");
};
控制台记录时抛出 TypeScript 错误test.okay
,因为它显然不存在。
Property `okay` does not exist on type `UndetereminedEmotion`.
即使它很可能存在,但如果传递给该方法的测试是 type EmotionsOkay
。
为什么会这样?
解决方案
在这一点上,TS 不知道它是什么类型,它可能是EmotionsOkay
并且一切都会好的,或者它可能是EmotionsNotOkay
并且属性okay
不存在。这就是您收到此错误的原因。您需要验证它是哪种类型。
您可以使用in
关键字来验证,
interface EmotionsOkay {
emotion: string;
okay: "yap";
}
interface EmotionsNotOkay {
emotion: string;
}
type UndetereminedEmotion = EmotionsOkay | EmotionsNotOkay;
const areYouOkay = (test: UndetereminedEmotion) => {
console.log('okay' in test && test.okay ? "happy :D" : "sad D:");
};
如果你一开始就没有财产okay
,你就不会快乐。
如果您想知道为什么在这种情况下不能使用instanceof
,请查看此问题
推荐阅读
- reactjs - 超集 ui 图表类型未注册
- java - Java bin 不在我的路径中,但我可以从终端运行 java 和 javac。这是怎么发生的?
- jenkins - 如果我需要部署所有服务器,如何通过Jenkins中的参数化值选择多个服务器。?
- python - 处理大量excel文件的脚本
- angular - 在没有 Ivy 的 Angular 10 库中导入 RouterModule
- api - 视图如何使用视图模型和网络 API 获取数据
- python-3.x - 如何将数据传递给pytest中的monkeypatch
- c# - 无法使用 VIsual Studio 2019 安装 dotnet-svcutil 来注册 wsdl 服务
- python - 我想在 python rewrite 中编写 discord bot 以检查仅在频道中发送的嵌入中的内容
- python - Python statsmodels 保存的模型文件可以转换为 ONNX Runtime 格式吗?