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.
