Ich habe mich gefragt, ob ich bedingte Typen in TypeScript haben kann.
Derzeit habe ich die folgende Schnittstelle:
interface ValidationResult {
isValid: boolean;
errorText?: string;
}
Aber ich möchte entfernen errorText
und habe es nur, wenn isValid
es false
als erforderliche Eigenschaft ist.
Ich wünschte, ich könnte es als folgende Schnittstelle schreiben:
interface ValidationResult {
isValid: true;
}
interface ValidationResult {
isValid: false;
errorText: string;
}
Aber wie Sie wissen, ist das nicht möglich. Was ist Ihre Vorstellung von dieser Situation?
javascript
typescript
types
Arman
quelle
quelle
isValid
istfalse
?Antworten:
Eine Möglichkeit, diese Art von Logik zu modellieren, besteht darin, einen Unionstyp zu verwenden
Der Compiler kann dann den Typ basierend auf dem Booleschen Flag eingrenzen
quelle
r
dies hier vom Typ sein mussInvalid
.Um zu vermeiden, dass mehrere Schnittstellen erstellt werden, die nur zum Erstellen einer dritten verwendet werden, können Sie
type
stattdessen auch direkt abwechseln :quelle
Die durch Fehler demonstrierte Vereinigung ist, wie ich empfehle, damit umzugehen. Trotzdem hat Typescript so etwas wie " bedingte Typen ", und sie können damit umgehen.
Dies
ValidationResult
(was tatsächlichValidationResult<boolean>
auf den Standardparameter zurückzuführen ist) entspricht der Vereinigung, die in der Antwort von Bugs oder in der Antwort von CertainPerformance erzeugt wird , und kann auf dieselbe Weise verwendet werden.Der Vorteil hierbei ist, dass Sie auch einen bekannten
ValidationResult<false>
Wert weitergeben können und dann nicht testen müssen,isValid
wie es bekannt istfalse
underrorString
bekanntermaßen existiert. In einem solchen Fall wahrscheinlich nicht erforderlich - und bedingte Typen können komplex und schwer zu debuggen sein, sodass sie wahrscheinlich nicht unnötig verwendet werden sollten. Aber Sie konnten, und das schien erwähnenswert.quelle
extends
ist der richtige Operator. Und es ist extrem leistungsfähig, zumal Sie es auch verwenden können, um in Typen zu graben :type SecondOf<T> = T extends Pair<any, infer U> ? U : never;
.SecondOf<number>
"erweitert"Pair<any, number>
? Ich denke, das Sprichwort "Beurteile ein Buch nicht nach seinem Einband" ist hier relevant.SecondOf<Pair<any, number>>
bewertet zunumber
.SecondOf<number>
bewertetnever
, weilnumber extends Pair<any, infer U>
falsch ist, wienumber
keine verlängertPair