Sie können den Typ einer vorhandenen Eigenschaft nicht ändern.
Sie können eine Eigenschaft hinzufügen:
interface A {
newProperty: any;
}
Aber eine Art von vorhandenem ändern:
interface A {
property: any;
}
Führt zu einem Fehler:
Nachfolgende Variablendeklarationen müssen denselben Typ haben. Die Variable 'property' muss vom Typ 'number' sein, hat hier jedoch den Typ 'any'.
Sie können natürlich eine eigene Schnittstelle haben, die eine vorhandene erweitert. In diesem Fall können Sie einen Typ nur auf einen kompatiblen Typ überschreiben, z. B.:
interface A {
x: string | number;
}
interface B extends A {
x: number;
}
Übrigens sollten Sie die Verwendung Object
als Typ wahrscheinlich vermeiden , stattdessen den Typ verwenden any
.
In den Dokumenten für den any
Typ heißt es:
Jeder Typ ist eine leistungsstarke Methode, um mit vorhandenem JavaScript zu arbeiten. So können Sie die Typprüfung während der Kompilierung schrittweise aktivieren und deaktivieren. Sie können erwarten, dass Object eine ähnliche Rolle spielt wie in anderen Sprachen. Mit Variablen vom Typ Object können Sie ihnen jedoch nur einen beliebigen Wert zuweisen. Sie können keine beliebigen Methoden für sie aufrufen, auch keine tatsächlich vorhandenen :
let notSure: any = 4;
notSure.ifItExists(); // okay, ifItExists might exist at runtime
notSure.toFixed(); // okay, toFixed exists (but the compiler doesn't check)
let prettySure: Object = 4;
prettySure.toFixed(); // Error: Property 'toFixed' doesn't exist on type 'Object'.
Ich benutze eine Methode, die zuerst die Felder filtert und sie dann kombiniert.
Referenz Eigenschaft vom Typ ausschließen
für Schnittstelle:
quelle
extend
standardmäßig funktioniert, aber leiderOmit
behebt dieses kleine Problem alles DawInspiriert von der
extends Omit
Lösung von ZSkycat habe ich mir Folgendes ausgedacht :Beispiel:
Schritt für Schritt gehen:
TypeScript-Dienstprogrammtypen
quelle
Wenn Sie die Antwort von @ zSkycat ein wenig erweitern, können Sie ein Generikum erstellen, das zwei Objekttypen akzeptiert und einen zusammengeführten Typ zurückgibt, wobei die Mitglieder des zweiten die Mitglieder des ersten überschreiben.
quelle
Omit
die Eigenschaft beim Erweitern der Schnittstelle:quelle
Es ist lustig, dass ich den Tag damit verbringe, die Möglichkeit zu untersuchen, den gleichen Fall zu lösen. Ich habe festgestellt, dass dies nicht möglich ist:
Ursache Ein Modul kennt möglicherweise nicht alle verfügbaren Typen in Ihrer Anwendung. Und es ist ziemlich langweilig, alles von überall zu portieren und Code wie diesen zu machen.
Sie müssen den Typ später definieren, damit die automatische Vervollständigung gut funktioniert.
So können Sie ein bisschen schummeln:
Belassen Sie standardmäßig den Typ some, der die automatische Vervollständigung ermöglicht, wenn keine Überschreibungen erforderlich sind.
Dann
Deaktiviere die dumme Ausnahme hier mit der
@ts-ignore
Flagge und sage uns, dass wir etwas falsch machen. Und lustig, dass alles wie erwartet funktioniert.In meinem Fall reduziere ich die Scope-Vision des Typs
x
, sodass ich Code strenger ausführen kann. Zum Beispiel haben Sie eine Liste mit 100 Eigenschaften und reduzieren diese auf 10, um dumme Situationen zu vermeidenquelle
Wenn jemand anderes einen generischen Dienstprogrammtyp benötigt, habe ich die folgende Lösung gefunden:
Ich brauchte das, weil in meinem Fall der Schlüssel zum Überschreiben ein Generikum selbst war.
Wenn Sie noch nicht
Omit
fertig sind, lesen Sie Ausschließen der Eigenschaft vom Typ .quelle
Um die Art der Immobilie einzugrenzen,
extend
funktioniert einfach perfekt, wie in Nitzans Antwort :Um den Typ zu erweitern oder allgemein zu überschreiben , können Sie die Lösung von Zskycat ausführen :
Wenn Ihre Schnittstelle
A
jedoch eine allgemeine Schnittstelle erweitert, verlieren SieA
bei Verwendung die verbleibenden Eigenschaften der benutzerdefinierten TypenOmit
.z.B
Der Grund ist, dass
Omit
intern nurExclude<keyof A, 'x'>
Schlüssel besprochen werden, diestring | number
in unserem Fall der allgemeine sind . Also,B
würde{x: number; }
und akzeptiert jede zusätzliche Eigenschaft mit der Art vonnumber | string | boolean
.Um dies zu beheben, habe ich mir einen anderen
OverrideProps
Dienstprogrammtyp ausgedacht:Beispiel:
quelle