【发布时间】:2019-11-14 23:12:19
【问题描述】:
我经常使用类型化数组,而且我的很多函数确实应该能够使用任何类型的类型化数组(例如,对 Uint8Array 或 Float32Array 求和)。有时,我可以只使用一个简单的类型联合,但我经常会遇到同样的错误。
一个简单的例子:
type T1 = Uint8Array;
type T2 = Int8Array;
type T3 = Uint8Array | Int8Array;
// No problems here:
const f1 = (arr: T1) => arr.reduce((sum, value) => sum + value);
const f2 = (arr: T2) => arr.reduce((sum, value) => sum + value);
// Does not work:
const f3 = (arr: T3) => arr.reduce((sum, value) => sum + value);
f3 的错误是:
Cannot invoke an expression whose type lacks a call signature. Type '
{
(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number): number;
(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number, initialValue: number): number;
<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8Array) => U, initialValue: U): U;
} | {
(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number): number;
(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number, initialValue: number): number;
<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int8Array) => U, initialValue: U): U;
}' has no compatible call signatures.ts(2349)
根据docs:
如果我们有一个联合类型的值,我们只能访问联合中所有类型共有的成员。
我在这里使用reduce 的方式对所有数组都是通用的,但我推测问题是可选的第四个参数(Uint8Array.prototype.reduce 是Uint8Array,但Int8Array.prototype.reduce 是Int8Array )。
是否有一个简单的解决方法?还是我需要为map、reduce、filter 中的每一个编写一个泛型实现?
【问题讨论】:
-
好吧有一个丑陋的解决方案
(arr as Uint8Array).reduce((a, b) => a + b);
标签: javascript typescript typescript-typings typed-arrays