Búsqueda de sitios web

typescript - Tipos de datos condicionales en tipos de datos unión


Suponga que tiene los siguientes tipos:

type Foo = {
    prop1: 'foo',
    prop2: null
}

type Bar = {
    prop1: 'bar',
    prop2: number
}

type FooOrBar = Foo | Bar

¿Es posible reescribir el código anterior usando tipos condicionales?

He intentado lo siguiente:

type FooOrBar = {
    prop1: 'foo' | 'bar'
    prop2: FooOrBar['prop1'] extends 'foo' ? null : number
}

Pero al intentar declarar una variable así:

const sample1: FooOrBar = {
    prop1: 'foo',
    prop2: null
}

Recibo el siguiente error:

El tipo 'null' no se puede asignar al tipo 'number'.

Parece que FooOrBar['prop1'] extends 'foo' siempre es false, lo cual no debería ser así ya que FooOrBar['prop1'] es un tipo unión de 'foo' | 'bar'

¿Qué estoy haciendo mal?

Respuesta #1

Podrías hacer eso, pero aún necesitarías proporcionar el argumento de tipo explícitamente.

type FooOrBar<T extends 'foo' | 'bar'> = {
  prop1: T;
  prop2: T extends 'foo' ? null : number;
}

const test: FooOrBar<'foo'> = {
  prop1: 'foo',
  prop2: null,
}