Typoskript-Schnittstelle - Möglich zu machen, "die ein oder andere" Eigenschaften, die benötigt werden?
Möglicherweise eine seltsame Frage, aber ich bin neugierig, ob es möglich ist, eine Schnittstelle, wo eine Eigenschaft oder das andere erforderlich ist.
Also, zum Beispiel...
interface Message {
text: string;
attachment: Attachment;
timestamp?: number;
//...etc
}
interface Attachment {...}
In dem genannten Fall, würde ich mag, um sicherzustellen, dass entweder text
oder attachment
vorhanden ist.
Hoffentlich, das macht Sinn.
Vielen Dank im Voraus!
Edit: Dies ist, wie ich es jetzt gerade Tue. Dachte, es war ein bisschen Ausführlicher (Eingabe botkit für 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;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie ein union-Typ, dies zu tun:
Wenn Sie möchten, dass text und Anhang, schreiben Sie
text?: string
undattachment?: Attachment
zu MessageBasics. Andernfalls müssen Sie die Verwendung von type-assertion-jeder Zeit Sie finden diese Eigenschaften, z.B.(myMessage as MessageWithText).text
statt nurmyMessage.text
.Danke @ryan-cavanaugh, die mich in die richtige Richtung.
Ich habe einen ähnlichen Fall, aber dann mit array-Typen. Kämpfte ein wenig mit der syntax, weshalb ich es hier zur späteren Referenz:
Update:
Beachten Sie, dass später, könnte man immer noch Warnungen, wie Sie die deklarierte variable im code. Sie können dann die
(variable as type)
syntax.Beispiel:
.map()
code. Die Verwendung von type-guard mit derin
Betreiber. Typoskript tun ordnungsgemäße Typ-Inferenz, etc. Also, Ihr Zustand wäreif('requiredPropA' in rule) { /* inside here, TS knows rule is of type <RuleA> */ }
Können Sie erstellen, die wenige Schnittstellen für die erforderlichen Bedingungen und nehmen Sie Sie in einer Art wie hier: