2017-03-24 2 views
1

haben Wenn Sie eine Record Klasse mit einer optionalen Eigenschaft haben, versuchen, etwa so:Wie eine Immutable.js optional (Typoskript) Record-Klasse Eigenschaft

class MyRecord extends Immutable.Record({ 
    field: undefined 
}) { 
    field?: string; 
} 

... Sie erhalten einen Typoskript Fehler wie so :

ERROR in [at-loader] myFile.ts:x:y 
TS2415: Class 'MyRecord' incorrectly extends base class 'Instance<{ field: undefined; }> & Readonly<{ field: undefined; }>'. 
    Type 'MyRecord' is not assignable to type 'Readonly<{ field: undefined; }>'. 
    Types of property 'field' are incompatible. 
    Type 'string | undefined' is not assignable to type 'undefined'. 
    Type 'string' is not assignable to type 'undefined'. 

Wenn Sie wie so der field Standardwert loszuwerden:

class MyRecord extends Immutable.Record({}) { 
    field?: string; 
} 

... Typescript beschwert sich nicht mehr, aber dann können Sie die Feldeigenschaft für Klasseninstanzen nicht festlegen (wegen der API Record).

Wie sollen wir das umgehen, wenn wir eine optionale Eigenschaft haben wollen?


Typoskript Version: 2.2.1

Immutable.js Version: 4.0.0-rc-1

Antwort

2

Typoskript sieht nicht an der Unterklasse Körper, wenn die Art der Oberklasse Folgern.

Der Typ der Superklasse wird von Immutable.Record({ field: undefined }) zu Immutable.Record<{ field: undefined }> abgeleitet. Daher ist der Typ der Unterklasse nicht mit der Oberklasse kompatibel.

Um dies zu beheben, müssen Sie die Typinformationen in der übergeordneten Klasse erklären, nicht die Unterklasse:

class MyRecord extends Immutable.Record<{ 
    field?: string 
}>({ 
    field: undefined 
}) { } 
Verwandte Themen