首页 > 解决方案 > 打字稿:组合类型上不存在属性?

问题描述

以下抽象的 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

为什么会这样?

标签: typescripttypescript-typings

解决方案


在这一点上,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,请查看此问题

这里是游乐场


推荐阅读