Condicionales distributivos en TypeScript
Un condicional sobre un parámetro de tipo desnudo corre una vez por miembro de la unión.
type Boxed<T> = T extends unknown ? { value: T } : never;
type NotBoxed<T> = [T] extends [unknown] ? { value: T } : never;
type Distributed = Boxed<string | number>;
type Together = NotBoxed<string | number>;
type MyExclude<T, U> = T extends U ? never : T;
type MyExtract<T, U> = T extends U ? T : never;
type MyNonNullable<T> = T extends null | undefined ? never : T;
type Levels = "debug" | "info" | "warn" | "error";
type Loud = MyExclude<Levels, "debug" | "info">;
type Quiet = MyExtract<Levels, "debug" | "info">;
const one: Distributed = { value: 1 };
const both: Together = { value: "either" };
const loud: Loud = "error";
const quiet: Quiet = "debug";
const defined: MyNonNullable<string | null> = "here";
console.log(one, both, loud, quiet, defined);
Cómo funciona
- La distribución es la razón de que Exclude y Extract funcionen.
- Envolver el parámetro en una tupla apaga la distribución.
- Es la regla más sorprendente de todo el sistema de tipos.
Palabras clave y builtins usados aquí
DistributedLoudMyNonNullableQuietTTogetherconstextendsnevernumberstringtype
El intento, en números
- Líneas
- 20
- Caracteres a escribir
- 763
- Tokens
- 206
- Ritmo de tres estrellas
- 105 tpm
Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 118 segundos.
Paso 3 de 3 en Tipos condicionales; paso 3 de 12 en Programación a nivel de tipos.