Búsqueda de sitios web

typescript - Inferir a un tipo literal de cadena estrecha desde el tipo de retorno


const createFruit = <T extends string[]>(fruits: T): typeof fruits[0] => fruits[0]

const fruit = createFruit(['apple', 'orange']) // fruit is of type `string`

Quiero que el tipo de fruit se infiera como el literal de cadena apple. ¿No hay forma de hacer esto?

Respuesta #1

Usar la sintaxis de tupla variádica para el parámetro fruits indicará al compilador que infiera el tipo literal.

const createFruit = <T extends string[]>(
  fruits: [...T]
): typeof fruits[0] => fruits[0]

const fruit = createFruit(['apple', 'orange'])
//    ^? fruit: "apple"

Parque infantil

Respuesta #2

A partir de TS 5.0 podrás usar el modificador const en los parámetros de tipo así:

const createFruit = <const T extends readonly string[]>(fruits: T): T[0] => fruits[0]

const fruit = createFruit(['apple', 'orange']) 

Por ahora, una posible solución es la siguiente:

const createFruit = <N extends string, T extends N[] | []>(fruits: T): T[0] => fruits[0]

const fruit = createFruit(['apple', 'orange']) 

En el cual declaras otro parámetro de tipo N para estrechar la inferencia de cadenas a literales de tipo cadena reales, luego estableces el límite superior para T a T[] | [], donde | [] le indica a TS inferir un tipo de tupla en lugar de un tipo de arreglo.

En ambos casos, el tipo de retorno podría simplemente ser T[0].

Artículos relacionados