2017-12-05 1 views
2

ich mein Gehirn Abstich, warum der folgende Code nicht kompiliert:Typoskript TS2322 Fehler beim Lookup-Typen mit

interface Circle { type: "circle"; } 
interface Rectangle { type: "rectangle"; } 
type Shape = Circle | Rectangle; 

interface Circle { type: "circle"; } 
interface Rectangle { type: "rectangle"; } 
type ShapeTemplate = { 
    type: Shape["type"]; 
}; 

const fromTemplate = (template: ShapeTemplate): Shape => template; 

Es bricht mit:

TS2322: Type 'ShapeTemplate' is not assignable to type 'Shape'. Type 'ShapeTemplate' is not assignable to type 'Rectangle'. Types of property 'type' are incompatible. Type '"circle" | "rectangle"' is not assignable to type '"rectangle"'. Type '"circle"' is not assignable to type '"rectangle"'.

Antwort

3

Die kurze Antwort ist, dass Im Allgemeinen ist es für den TypeScript-Compiler zu komplex, {x: A} | {x: B} auf {x: A|B} zu reduzieren.

Sie können darüber in der Diskussion bei Microsoft/TypeScript#7553 und einigen anderen Orten lesen, die ich nicht sofort finden kann. (Edit: siehe auch Microsoft/TypeScript#18230.) Ich denke, dass die Betreuer der Sprache es nicht wert zu versuchen, dies zu implementieren, weil die meiste Zeit es in der Praxis nicht sinnvoll ist; Typen Menschen wirklich verwenden in der Regel haben mehr als eine Eigenschaft, und sobald Sie {x: A, y: P } | {x: B, y: Q} haben, ist eine Reduzierung auf etwas wie {x: A|B, y: P|Q} nicht gültig.

In der Praxis ist die Abhilfe hier nur behaupten, dass ein ShapeTemplate-Shape zuweisbare ist, etwa so:

const fromTemplate = (template: ShapeTemplate): Shape => template as Shape; 

Hoffnung, die hilft; Viel Glück!

Verwandte Themen