typescript - Är unionstyper inte tvingande?


Borde inte detta misslyckas?

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?

Finns det ett sätt att genomdriva typkontroll i det här fallet?

Svar #1

TypeScript hanterar typkompatibilitet baserat på strukturell subtypning.

Strukturell typning är ett sätt att relatera typer enbart baserat på deras medlemmar

Speciellt för klasser:

När man jämför två objekt av en klastyp jämförs endast medlemmarna i instansen. Statiska medlemmar och konstruktorer påverkar inte kompatibiliteten.

Mer information på https://www.typescriptlang.org/docs/handbook/type-compatibility.html#classes

Svar #2

Det kommer att misslyckas om Animal eller Person definierar något:

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

Eftersom du inte har definierat något i Animal eller Person, uppfyller en sträng (eller egentligen vad som helst) kontraktet du efterfrågar.

Relaterade artiklar