2017-01-05 3 views
4

Sollte das nicht scheitern?Sind Union-Typen nicht erzwungen?

class Animal { } 
class Person { } 

type MyUnion = Number | Person; 

var list: Array<MyUnion> = [ "aaa", 2, new Animal() ]; // Shouldn't this fail? 

var x: MyUnion = "jjj"; // Shouldn't this fail? 

Gibt es eine Möglichkeit, die Typprüfung in diesem Fall zu erzwingen?

Antwort

4

TypeScript verarbeitet Typkompatibilität basierend auf structural subtyping.

Strukturelle Typisierung ist eine Art und Weise Arten beziehen sich nur auf ihre Mitglieder

Insbesondere für Klassen:

Wenn zwei Objekte einer Klasse-Typ zu vergleichen, nur Mitglieder der Instanz werden verglichen. Statische Member und Konstruktoren wirken sich nicht auf die Kompatibilität aus.

Mehr Infos unter https://www.typescriptlang.org/docs/handbook/type-compatibility.html#classes

+0

Danke. Upvoted. Würde man das "Ente tippen" nennen? – KarolDepka

+1

Ja, ich denke, man könnte es so nennen, Typoskript bezeichnet es formal als "strukturelles Subtyping". Wikipedia hat eine gute Erklärung zu Duck Typing und Typescript https://en.wikipedia.org/wiki/Duck_typing#In_Typescript – shusson

3

Es wird fehlschlagen, wenn Animal oder Person etwas definieren:

class Animal { name: string; } 
class Person { age: Number; } 

type MyUnion = Number | Person; 

var list: Array<MyUnion> = [ "aaa", 2, new Animal() ]; // Fails now 

var x: MyUnion = "jjj"; // Fails now 

Da Sie nichts in Animal oder Person definiert haben, eine Zeichenfolge (oder irgendetwas, tatsächlich), erfüllt der Vertrag Sie fragen zum.

+0

Dank. Upvoted. Behandelt es Tier/Person als eine Art "beliebigen" Typ? – KarolDepka

+0

Semi-related: http://www.typescriptlang.org/play/ zeigt Fehlerhinweise, aber läuft immer noch den Code, den Sie geschrieben haben. Gibt es eine Möglichkeit, das Ausführen von Fehlern zu erzwingen? – KarolDepka

+1

@KarolDepka Ich bin mir nicht sicher über die Interna, ob es ein 'any' ist, aber der Vertrag sagt einfach "Ich möchte, dass das Objekt die folgenden Mitglieder enthält: {}". Da wir keine Mitglieder bitten, anwesend zu sein, kann jeder Typ diese Anfrage erfüllen. – Rob

Verwandte Themen