Estou tentando entender como infer
funcionam os tipos condicionais do TypeScript. Uma coisa que notei sobre infer
os tipos no TypeScript é que eles são definidos para permitir um elemento rest após outro elemento rest. Por exemplo:
type A<T> = T extends [...infer X, 0, ...infer Y] ? [X, Y] : never;
type B = A<[1, 2]>; // B = [unknown[], unknown[]]
Curiosamente, o TypeScript não apenas diz que esse código é válido; a condição também é bem-sucedida , dando-nos X = unknown[]
e Y = unknown[]
. No entanto, quando substituímos esses tipos inferidos, o TypeScript nos dá um erro:
type C<T> = T extends [...unknown[], 0, ...unknown[]] ? true : false;
// Error: A rest element cannot follow another rest element. (1265)
Por que o TypeScript exige que você use infer
vários elementos restantes e por que diz que o tipo [1, 2]
contém o elemento 0
?