2016-06-07 70 views
6

可能是一個奇怪的問題,但我很好奇,如果有可能做一個界面,其中一個屬性或其他需要。Typescript接口 - 可能需要「一個或另一個」屬性?

因此,舉例來說...

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

interface Attachment {...} 

在上述情況下,我想,以確保無論是textattachment存在。

希望這是有道理的。

在此先感謝!


編輯:這是我正在做它現在。認爲它有點冗長(輸入botkit for slack)。

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; 
} 

回答

10

可以使用聯合類型做到這一點:

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); 
+1

但這不會讓他有一個文本和附件的信息 – Roberto

+0

感謝您的回覆瑞安!這就是我現在正在做的事情。我在上面的問題中加了這個。 不確定是否有更清晰的方式去解決它。 – dsifford

相關問題