1. ホーム
  2. typescript

[解決済み] Typescript Interface - 「どちらか一方」のプロパティを必須とすることは可能か?

2022-04-26 10:35:06

質問

変な質問かもしれませんが、どちらかのプロパティが必要なインターフェースを作ることは可能なのでしょうか?

では、例えば...

interface Message {
    text: string;
    attachment: Attachment;
    timestamp?: number;
    // ...etc
}

interface Attachment {...}

上記の場合、どちらか一方を text または attachment が存在します。


今、私がやっているのはこの方法です。少し冗長だと思いました(slackにbotkitと入力する)。

interface Message {
    type?: string;
    channel?: string;
    user?: string;
    text?: string;
    attachments?: Slack.Attachment[];
    ts?: string;
    team?: string;
    event?: string;
    match?: [string, {index: number}, {input: string}];
}

interface AttachmentMessageNoContext extends Message {
    channel: string;
    attachments: Slack.Attachment[];
}

interface TextMessageNoContext extends Message {
    channel: string;
    text: string;
}

解決方法は?

ユニオン型を使えばいいんです。

interface MessageBasics {
  timestamp?: number;
  /* more general properties here */
}
interface MessageWithText extends MessageBasics {
  text: string;
}
interface MessageWithAttachment extends MessageBasics {
  attachment: Attachment;
}
type Message = MessageWithText | MessageWithAttachment;

テキストと添付ファイルの両方を許可したい場合は、次のように記述します。

type Message = MessageWithText | MessageWithAttachment | (MessageWithText & MessageWithAttachment);