TypeScript: Distribución de tipos condicionales en arrays de tipo unión
Tengo un tipo condicional que usa un tipo genérico T para determinar un tipo Array<T>. Como un ejemplo artificial:
type X<T> = T extends string ? Array<T> : never;
El problema que tengo es que, cuando proporciono un tipo de unión, se distribuye como una unión de 2 tipos de arreglos en lugar de un arreglo de mi tipo de unión.
// compiler complains because it expects Array<'one'> | Array<'two'>
const y: X<'one' | 'two'> = ['one', 'two'];
¿Existe una manera de escribir esto de tal forma que mi tipo condicional produzca un Array<'one' | 'two'> si se cumple la condición?
Respuesta #1
Te has encontrado con el comportamiento distributivo de los tipos condicionales, donde un tipo condicional se distribuye sobre un parámetro de tipo desnudo que contiene una unión. Este comportamiento es muy útil en algunos escenarios, pero puede ser un poco sorprendente al principio.
La opción más simple para desactivar este comportamiento es poner el parámetro de tipo en una tupla:
type X<T> = [T] extends [string] ? Array<T> : never;
// ok y is Array<'one' | 'two'>
const y: X<'one' | 'two'> = ['one', 'two'];
Puedes leer más sobre este comportamiento aquí y aquí
