type BuildArray<
Length extends number,
Ele = unknown,
Arr extends unknown[] = []
> = Arr['length'] extends Length
? Arr
: BuildArray<Length, Ele, [...Arr, Ele]>;
type Add<Num1 extends number, Num2 extends number> =
[...BuildArray<Num1>,...BuildArray<Num2>]['length'];
type AddResult = Add<32, 25>;
这是我在掘金上面买的一本小册里面的内容,有个疑问我看了作者的解释后还是不懂。
Arr['length'] extends Length
如果把这个条件语句extends的两侧的变量互换位置,变成Length extends Arr['length']
后,Add这个高级类型会出现无限的问题。作者给出的解释是传入的Length类型因为受到extends的约束导致其传入的类型其实是number类型,所以导致条件语句一直为false,陷入无限递归的情况。按照上面推断出来的Length类型为number类型,那么当Array['length'] extends Length永远为true,就不走递归的分支了,但是结果却很明显的反馈出了Array['length'] extends Length并不是一直为true。
简化一下其实就是
泛型中
Length extends number
所以推导的时候Length
就是当做number
处理而不是具体的某个数字