2016-06-07 7 views
6

Möglicherweise eine seltsame Frage, aber ich bin neugierig, ob es möglich ist, eine Schnittstelle zu machen, wo die eine oder die andere Eigenschaft benötigt wird.Typescript Interface - Kann man "eine oder andere" Eigenschaften benötigen?

So zum Beispiel ...

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

interface Attachment {...} 

Im obigen Fall, würde ich sicherstellen möchte, dass entweder text oder attachment existiert.

Hoffentlich macht das Sinn.

Vielen Dank im Voraus!


Edit: Dies ist, wie ich es jetzt tue. Dachte, es war ein bisschen ausführlich (Botkit für locker).

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

Antwort

10

können Sie eine Vereinigung Art, dies zu tun:

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

Wenn Sie sowohl Text als auch Befestigung zulassen möchten, würden Sie

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

schreiben, aber dies wird ihm erlauben, nicht zu Habe eine Nachricht mit einem Text und einem Anhang – Roberto

+0

Danke für die Antwort Ryan! So mache ich es gerade jetzt. Ich habe das zu meiner Frage oben hinzugefügt. War mir nicht sicher, ob es einen saubereren Weg gab. – dsifford

Verwandte Themen