Я много работаю с типизированными массивами, и многие мои функции действительно должны работать с любым типом массивов (например, суммируя 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)
Согласно документам :
Если у нас есть значение, имеющее тип объединения, мы можем получить доступ только к тем элементам, которые являются общими для всех типов в объединении.
То, как я здесь использую reduce
, является общим для всех массивов, но я предполагаю, что проблема заключается в необязательном 4-м аргументе (который для Uint8Array.prototype.reduce
равен Uint8Array
, а для Int8Array.prototype.reduce
равен Int8Array
).
Есть ли простой обходной путь для этого? Или мне нужно написать обобщенную реализацию для каждого из map
, reduce
, filter
?