Implementa `Add<A, B>` para que devuelva la suma como tipo literal numérico. TypeScript no tiene aritmética a nivel de tipos, así que hay que contar — `BuildTuple<N>` está disponible y da una tupla de longitud `N`.
01
Intenta el puzle tú mismo
Par 5
Puzle
type-level-add.ts
type BuildTuple<N extendsnumber, Acc extendsunknown[] = []> =
Acc['length'] extends N ? Acc : BuildTuple<N, [...Acc, unknown]>
type Add<A extendsnumber, B extendsnumber> = ???
Intento 1 de 5Aún sin comprobar
Sustituye ??? — tu solución se comprueba con los casos de abajo.
Comprobaciones
4
Add<1, 2>—
→ 3
Add<0, 0>—
→ 0
Add<12, 5>—
→ 17
Add<40, 2>—
→ 42
Cómo se juzga una comprobación Igualdad exacta de tipos, no asignabilidad — una intersección no es lo mismo que el objeto aplanado.
Cómo le fue a todo el mundo
Nobody is counting yet. Score distribution and the juego corto board arrive with accounts — until then your results stay on this device.
type Add<A extendsnumber, B extendsnumber> = [
...BuildTuple<A>,
...BuildTuple<B>,
]['length']
El error más común
type Add<A extendsnumber, B extendsnumber> =
BuildTuple<A>['length'] extendsinfer X ? X : never
Esto recupera una longitud pero nunca combina las dos tuplas, así que `B` se ignora por completo. La aritmética tiene que ocurrir dentro de la tupla, no después.
Línea por línea
[...BuildTuple<A>, ...BuildTuple<B>]
Expansiones de tuplas variádicas. Dos tuplas de longitud `A` y `B` se concatenan en una de longitud `A + B` — esa concatenación es la suma.
['length']
Un acceso indexado sobre una tupla. Para una tupla de longitud fija, la propiedad `length` es un tipo literal numérico, que es justo la respuesta.
Para recordar
La aritmética a nivel de tipos es contar disfrazado. La longitud de tupla es el único contador que da TypeScript, y el límite de recursión lo corta cerca del millar — por eso nadie publica una calculadora a nivel de tipos.