ts类型编程实现加法操作碰到问题,具体需看详情?

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。

阅读 1.6k
2 个回答

简化一下其实就是

type a = number
type b = 1
type c = 1 extends a ? number : string // 这里是 number
type d = a extends 1 ? number : string // 这里是 string

泛型中Length extends number所以推导的时候Length就是当做number处理而不是具体的某个数字

BuildArray: 这个类型别名用于构建指定长度和元素类型的数组类型。它接收三个参数,Length 表示数组长度,Ele 表示元素类型,Arr 表示已构建的数组,初始值为空数组。如果 Arr 的长度等于 Length,则返回 Arr,否则将 Ele 推入 Arr 并递归调用 BuildArray 函数,直到 Arr 的长度等于 Length。

logo
Microsoft
子站问答
访问
宣传栏