Inyección de dependencias por tipo en TypeScript
Depende de una interfaz; quien llama provee lo que sea que la satisfaga.
interface Clock {
now(): number;
}
interface Store {
save(lang: string, tpm: number): Promise<void>;
}
interface Deps {
clock: Clock;
store: Store;
}
function makeRecorder({ clock, store }: Deps) {
return async function record(lang: string, tpm: number): Promise<string> {
await store.save(lang, tpm);
return `${lang} at ${tpm} (${clock.now()})`;
};
}
const calls: string[] = [];
const record = makeRecorder({
clock: { now: () => 1234 },
store: { save: async (lang, tpm) => void calls.push(`${lang}:${tpm}`) },
});
record("ts", 98).then((line) => console.log(line, calls));
Cómo funciona
- La interfaz es el contrato, y se mantiene pequeña.
- Una prueba pasa un fake sin ningún framework de por medio.
- Con aplicación parcial alcanza: no hace falta un contenedor.
Palabras clave y builtins usados aquí
ClockPromiseStoreasyncawaitconstfunctioninterfacenumberreturnstring
El intento, en números
- Líneas
- 27
- Caracteres a escribir
- 578
- Tokens
- 188
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 103 segundos.
Paso 2 de 5 en Construcción e inyección; paso 10 de 19 en Clases y patrones.