2016-06-07 12 views
6

Có thể là một câu hỏi kỳ lạ, nhưng tôi tò mò nếu có thể tạo giao diện trong đó một thuộc tính hoặc một thuộc tính khác là bắt buộc.Giao diện bản ghi - Có thể yêu cầu các thuộc tính "một hoặc khác" được yêu cầu?

Vì vậy, ví dụ ...

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

interface Attachment {...} 

Trong trường hợp trên, tôi muốn chắc chắn rằng một trong hai text hoặc attachment tồn tại.

Hy vọng điều đó có ý nghĩa.

Cảm ơn trước!


Chỉnh sửa: Đây là cách tôi đang thực hiện ngay bây giờ. Nghĩ rằng đó là một chút chi tiết (gõ botkit cho 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; 
} 

Trả lời

10

Bạn có thể sử dụng một loại công đoàn để làm điều này:

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

Nếu bạn muốn cho phép cả hai văn bản và tập tin đính kèm, bạn sẽ viết

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

nhưng điều này sẽ không cho phép ông có tin nhắn kèm theo văn bản và tập tin đính kèm – Roberto

+0

Cảm ơn bạn đã trả lời Ryan! Đó là cách tôi thực sự làm nó ngay bây giờ. Tôi đã thêm vào câu hỏi của mình ở trên. Không chắc chắn có cách nào sạch hơn không. – dsifford

Các vấn đề liên quan