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,
}