Búsqueda de sitios web

typescript - boolean[] en tipos condicionales se expande a true[] | false[]


Este tipo condicional intenta convertir el argumento de tipo U en un arreglo:

type MakeArray<U> = U extends boolean ? Array<U> : U;

Sin embargo, cuando se pasa boolean:

type T5 = MakeArray<boolean>;

El resultado es type T5=true[] | false[].

He visto https://github.com/microsoft/TypeScript/issues/30029 pero eso parece tratar sobre promesas/valores de retorno y en teoría se solucionó en TS 3.5.

Es decir, AFAICT ese problema trata sobre primitivos y distribución sobre uniones, pero estoy verificando explícitamente contra extends boolean y no algo como extends boolean | number | string.

Respuesta #1

La respuesta probablemente llega un poco tarde, pero funciona infiriendo el argumento de tipo si es una matriz así

type MakeArray<T, V = T> = T extends Array<infer V> ? T : Array<V>;

type TBoolean = MakeArray<boolean>; // boolean[]
type TBooleanArray = MakeArray<Array<boolean>>; // boolean[]

type TString = MakeArray<string>; // string[]
type TStringArray = MakeArray<Array<string>>; // string[]

Respuesta #2

La respuesta parece ser "Tipos Condicionales Distributivos". Vea https://www.typescriptlang.org/docs/handbook/2/conditional-types.html#distributive-conditional-types.

Esto te permite controlar cómo se expanden los parámetros de unión genéricos:

type MakeArray<U> = [U] extends [boolean] ? Array<U> : U;
type T5 = MakeArray<boolean>;

Esto te da type T5=boolean[] como esperas.

Artículos relacionados