【发布时间】:2021-03-24 14:33:31
【问题描述】:
在普通的无类型 Javascript 中,编写一个可以对数字或 bigint 进行操作的函数并不难,具体取决于传入的参数:
const sumOfSquares = (a,b) => a*a + b*b;
sumOfSquares(3, 4); // returns 25
sumOfSquares(3n, 4n); // returns 25n
sumOfSquares(3n, 4); // throws a TypeError
似乎应该有一种方法可以在打字稿中声明这个函数,以便编译器强制参数一起工作。我试过了
const sumOfSquares = <N extends bigint | number>(a: N, b: N): N =>
a * a + b * b;
但是编译器拒绝了这个:
语义错误 TS2322:类型“数字”不可分配给类型“N”。
“number”可以分配给“N”类型的约束,但“N”可以用约束“number |”的不同子类型来实例化。 bigint'。
是否有不同的方式来编写类型声明以使其正常工作?
【问题讨论】:
-
你总是可以尝试重载,虽然它不像泛型那样干净。
-
我认为你甚至不能混合 bigint 和 number,例如1n+2无效,那么混合类型有什么意义呢?
-
The overload I thought of 不起作用。看起来 TypeScript 对 bigints 的支持参差不齐 - 例如它仍然假定
*总是返回一个数字。 -
@ABOS 目的是您需要传递两个数字或两个 bigint。但你是对的,这就是编译器的假设:你可以用联合
number | bigint(而不是其中一个)实例化N并破坏函数。 -
@Bergi,我在下面添加了重载版本,它很冗长,但似乎工作
标签: javascript typescript types bigint