TypeScript - Villkorliga datatyper på unionstyper
Anta att du har följande typer:
type Foo = {
prop1: 'foo',
prop2: null
}
type Bar = {
prop1: 'bar',
prop2: number
}
type FooOrBar = Foo | Bar
Är det möjligt att skriva om koden ovan med villkorliga typer?
Jag har försökt följande:
type FooOrBar = {
prop1: 'foo' | 'bar'
prop2: FooOrBar['prop1'] extends 'foo' ? null : number
}
Men när man försöker deklarera en var på detta sätt:
const sample1: FooOrBar = {
prop1: 'foo',
prop2: null
}
Jag får följande fel:
Typen 'null' kan inte tilldelas typen 'number'.
Det verkar som att FooOrBar['prop1'] extends 'foo' alltid är false vilket inte borde vara fallet eftersom FooOrBar['prop1'] är en unionstyp av 'foo' | 'bar'
Vad gör jag för fel?
Svar #1
Du skulle kunna göra det, men du skulle fortfarande behöva ange typargumentet uttryckligen.
type FooOrBar<T extends 'foo' | 'bar'> = {
prop1: T;
prop2: T extends 'foo' ? null : number;
}
const test: FooOrBar<'foo'> = {
prop1: 'foo',
prop2: null,
}
