Tipos recursivos en TypeScript
Un tipo que se refiere a sí mismo, que es como se tipan JSON y los árboles.
type Json =
| string
| number
| boolean
| null
| Json[]
| { [key: string]: Json };
interface TreeNode<T> {
value: T;
children: TreeNode<T>[];
}
type Paths<T> = T extends object
? { [K in keyof T & string]: K | `${K}.${Paths<T[K]>}` }[keyof T & string]
: never;
type Config = { server: { port: number; host: string }; debug: boolean };
type ConfigPath = Paths<Config>;
const document: Json = { runs: [{ lang: "ts", tpm: 98 }], ok: true };
const tree: TreeNode<string> = {
value: "root",
children: [{ value: "leaf", children: [] }],
};
const path: ConfigPath = "server.port";
console.log(typeof document, tree.children.length, path);
Cómo funciona
- La recursión debe pasar por un objeto, un arreglo o una unión.
- Un límite de profundidad evita que el compilador se rinda.
- Este es el tipo honesto para cualquier cosa con forma de JSON.
Palabras clave y builtins usados aquí
ConfigPathJsonTTreeNodebooleanconstdocumentextendsinterfacenumberstringtruetype
El intento, en números
- Líneas
- 27
- Caracteres a escribir
- 635
- Tokens
- 200
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 109 segundos.
Paso 2 de 2 en Cadenas y recursión; paso 8 de 12 en Programación a nivel de tipos.