Machen Sie alle Eigenschaften innerhalb einer Typescript-Schnittstelle optional

9

Ich habe eine Schnittstelle in meiner Anwendung:

%Vor%

das ist Teil einer Post-Schnittstelle:

%Vor%

Ich habe auch eine Schnittstelle, die für einen Post-Entwurf ist, wo das Asset-Objekt möglicherweise nur teilweise konstruiert ist

%Vor%

Ich möchte einem PostDraft -Objekt erlauben, ein partielles Asset-Objekt zu haben, während ich noch Typen auf den Eigenschaften überprüfe, die dort sind (also möchte ich es nicht einfach mit any austauschen).

Ich möchte grundsätzlich einen Weg finden, Folgendes zu generieren:

%Vor%

ohne die Schnittstelle Asset vollständig neu zu definieren. Gibt es eine Möglichkeit, dies zu tun? Wenn nicht, was wäre der schlaue Weg, meine Typen in dieser Situation zu arrangieren?

    
jkjustjoshing 26.09.2016, 22:25
quelle

3 Antworten

21

Dies ist in TypeScript & lt; nicht möglich. 2.1 ohne eine zusätzliche Schnittstelle mit optionalen Eigenschaften zu erstellen; Dies ist jedoch möglich, indem Sie in TypScript 2.1 zugeordnete Typen verwenden.

Verwenden Sie dazu die Partial<T> -Schnittstelle in lib .d.ts :

%Vor%

Nun sind alle Eigenschaften in asset optional, was Ihnen erlauben würde, dies zu tun:

%Vor%

Lesen Sie hier mehr über zugeordnete Typen .

    
David Sherret 16.10.2016, 22:51
quelle
4

Die Eigenschaften in der Schnittstelle sind entweder optional nicht, Sie können die gleiche Schnittstelle nicht einmal als optional und einmal wie 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ür die Asset :

%Vor%

Die Standardwerte hier sind statische Member, aber Sie können diese auf andere Arten erhalten oder einen Fehler ausgeben, falls sie fehlen.

Ich finde diesen Weg sehr angenehm, wenn ich mit jsons arbeite, die vom Server empfangen werden (oder etwas Ähnliches), die Schnittstellen repräsentieren die json-Daten und die Klassen sind die tatsächlichen Modelle, die mit den jsons als Anfangswerte konstruiert werden. p>     

Nitzan Tomer 26.09.2016 22:35
quelle
0

Wie wäre es, wenn Sie ein leeres Objekt erzwingen möchten, z. B.

?

const draft = <PostDraft>{} draft.id = 123 draft.internal_id = 456 draft.usage = 789

Wenn Sie dies wirklich brauchen, können Sie immer eine d.ts-Schnittstelle aus einer Vorlage erstellen, die sowohl die optionalen als auch die typisierten Eigenschaften enthält.

Wie Nitzan darauf hingewiesen hat, sind die Eigenschaften der Typoskript-Schnittstelle optional oder nicht

    
user3893988 27.09.2016 01:41
quelle

Tags und Links