gpt4 book ai didi

javascript - 为什么 'Add' 类型不满足约束 'number' ?

转载 作者:行者123 更新时间:2023-12-05 04:22:56 30 4
gpt4 key购买 nike

我尝试用 typescript 练习打字体操。我的目标是对数字文字实现数学运算。首先,我实现了 BuildArray 类型:

type BuildArray<
Length extends number,
Ele = unknown,
Arr extends unknown[] = []
> = Arr['length'] extends Length
? Arr
: BuildArray<Length, Ele, [...Arr, Ele]>;
type MyArray = BuildArray<3> // type MyArray = [unknown, unknown, unknown]

然后,我实现了 Add 类型:

type Add<Num1 extends number, Num2 extends number> = 
[...BuildArray<Num1>, ...BuildArray<Num2>]['length']
type AddResult = Add<2, 5> // type AddResult = 7

但是,当我尝试基于 Add 实现 Multiply 时,出现错误:

type Multiply<Num1 extends number, Num2 extends number, Counter extends number = 0, Result extends number = 0> =
Counter extends Num2?
Result:
Multiply<Num1, Num2, Add<Counter, 1>, Add<Num1, Result>>
type MultiplyResult = Multiply<4, 5> // type MultiplyResult = 20

虽然结果是正确的,但是出现了编译错误:

enter image description here

Playground link

谁能告诉我为什么会出现这个编译错误?

最佳答案

当你经过时CounterAdd<Counter, 1> ,它扩展了类型 number , 但它仍然是未知数。当它从 Add 传递过来时至 BuildArray ,然后你有这张支票:

Arr['length'] extends Length?

基于该检查,您有不同的预期类型 ArrBuildArray<Length, Ele, [...Arr, Ele]>这将再次遇到同样的问题。

回到Add ,在未知数的情况下,TypeScript 不会实现这个 length prop 是 Array 的 Prop , 这已经是一个 number .

所以你正确获取了值,但是类型本身仍然不确定这是一个 number ,因为支票Arr['length'] extends Length?BuildArray不解决才知道Arr是我们试图访问的类型 length来自。

我不确定这是否足够清楚,但是 TL;DR:要以最少的更改实现所需的功能,您需要告诉 TypeScript 这 Add type 永远是 number而不是依靠 TypeScript 自行学习。

例如,您可以通过添加 & number 来强制显示此信息:

type Add<Num1 extends number, Num2 extends number> =
[...BuildArray<Num1>, ...BuildArray<Num2>]['length'] & number
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^

或进行任何类型的检查。

Playground link

关于javascript - 为什么 'Add' 类型不满足约束 'number' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73863654/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com