Ich habe eine Schnittstelle in meiner Anwendung:
interface Asset {
id: string;
internal_id: string;
usage: number;
}
das ist Teil einer Post-Schnittstelle:
interface Post {
asset: Asset;
}
Ich habe auch eine Schnittstelle für einen Post-Entwurf, bei der das Asset-Objekt möglicherweise nur teilweise erstellt wird
interface PostDraft {
asset: Asset;
}
Ich möchte zulassen, dass ein PostDraft
Objekt ein Teil-Asset-Objekt hat, während die Typen der vorhandenen Eigenschaften überprüft werden (daher möchte ich es nicht einfach austauschen any
).
Grundsätzlich möchte ich einen Weg finden, um Folgendes zu generieren:
interface AssetDraft {
id?: string;
internal_id?: string;
usage?: number;
}
ohne die Asset
Schnittstelle komplett neu zu definieren . Gibt es eine Möglichkeit, dies zu tun? Wenn nicht, wie würde ich meine Typen in dieser Situation klug anordnen?
typescript
jkjustjoshing
quelle
quelle
Antworten:
Dies ist in TypeScript <2.1 nicht möglich, ohne eine zusätzliche Schnittstelle mit optionalen Eigenschaften zu erstellen. Dies ist jedoch möglich, indem zugeordnete Typen in TypeScript 2.1+ verwendet werden.
Verwenden Sie dazu den
Partial<T>
Typ, den TypeScript standardmäßig bereitstellt.Jetzt sind alle Eigenschaften
asset
aktiviert, sodass Sie Folgendes tun können:Über
Partial<T>
Partial<T>
wird definiert als ein zugeordnetes Typ , das jede Eigenschaft in der vorgesehenen Art optional (unter Verwendung des macht?
Token).Lesen Sie hier und im Handbuch mehr über zugeordnete Typen .
quelle
Required<T>
).Die Eigenschaften in der Schnittstelle sind entweder optional oder nicht. Sie können dieselbe Schnittstelle nicht einmal als optional und einmal als erforderlich verwenden.
Was Sie tun können, ist eine Schnittstelle mit optionalen Eigenschaften für die
AssetDraft
und dann eine Klasse mit obligatorischen Eigenschaften fürAsset
:Die Standardwerte hier sind statische Elemente, aber Sie können diese auf andere Weise abrufen oder einen Fehler auslösen, falls sie fehlen.
Ich finde diesen Weg sehr bequem, wenn ich mit jsons arbeite, die vom Server empfangen werden (oder etwas Ähnliches), die Schnittstellen die json-Daten darstellen und die Klassen die tatsächlichen Modelle sind, die unter Verwendung der jsons als Anfangswerte erstellt werden.
quelle
Zusätzlich zu David Sherret antworte nur ein paar Zeilen von meiner Seite, wie es direkt ohne
Partial<T>
Typ implementiert werden kann, um das Thema besser zu verstehen.quelle
Wenn ich eine explizite
AssetDraft
Schnittstelle haben möchte, würde ich eine Kombination ausextends
und verwendenPartial
:quelle
Wie wäre es mit einem gewaltsamen Werfen eines leeren Objekts, z
Wenn Sie dies wirklich wirklich benötigen, können Sie jederzeit eine d.ts-Schnittstelle aus einer Vorlage generieren, die sowohl die optionalen als auch die typisierten Eigenschaften enthält.
Wie Nitzan betonte, sind entweder die Eigenschaften der Typescript-Schnittstelle optional oder nicht
quelle