2016-06-07 54 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

相关问题