TypeScript: Inferencia de tipo incorrecta
Me topé con una inferencia de tipo incorrecta. Tal vez, al comprobar el tipo, se limita la profundidad de recorrido de estructuras complejas?
Versión de TypeScript: 4.1.5
type ZERO = 0
type Next<T> = T extends ZERO ? {v: ZERO} : (T extends {v: infer U} ? {v: Next<U>} : never)
type ONE = Next<ZERO>
type TWO = Next<ONE>
type THREE = Next<TWO>
type FOUR = Next<THREE>
type FIVE = Next<FOUR>
type SIX = Next<FIVE>
type SEVEN = Next<SIX>
type EIGHT = Next<SEVEN>
type NINE = Next<EIGHT>
type TEN = Next<NINE>
type TEq<T, P> = T extends P ? (P extends T ? true : never) : never
let v1:TEq<TWO, TWO> = true // correct: types is equal
let v2:TEq<TWO, THREE> = true // correct: type 'boolean' is not assignable to type 'never'
let v3:TEq<SIX, EIGHT> = true // error: why type of v3 inferred as true?
Enlace del parque
Respuesta #1
Aquí puedes encontrar la charla de Microsoft Build.
Este comentario explica la limitación del diseño
es un guardia de recursión para prevenir una computación literalmente infinita.
Si S necesita compararse con S<S> para determinar la asignabilidad, y luego S<S> necesita compararse con S<S<S>>, entonces S<S<S>> necesita compararse con S<S<S<S>>>, entonces S<S<S<S>>> necesita compararse con S<S<S<S<S>>>>,
En ese punto la verificación se detiene y se asume que la respuesta es "sí". Este caso en realidad ocurre bastante en la práctica;
Si tu modelo depende de que esta verificación se lleve a cabo de manera arbitrariamente profunda, entonces efectivamente estás pidiendo que el compilador a veces se congele para siempre verificando S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S>>>>>>>>>>>>>>>>>>>>>>>> contra S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S>>>>>>>>>>>>>>>>>>>>>>>>>
(lo cual a su vez verificará S<SS<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S>>>>>>>>>>>>>>>>>>>>>>>>>>.