TypeScript: “TypedArray” 接口用于类型化数组

4

我该如何告诉 TypeScript 给定的参数包含 Typed Arrays 中的一个?

选择最适合您需求的 Typed Array 的类型并不罕见(例如 Flatbush 库就是这样做的)。

我想检查传递给构造函数的内容是否确实标识了 Typed Arrays 中的一个。但在我的 lib.es6.d.ts 中,没有任何 Typed Arrays 继承自一个公共接口。

相关问题: "ArrayLike" 接口用于什么?


1
这个之前已经被建议过了。 - Patrick Roberts
3个回答

4

没有内置的别名,但是你可以根据 lib.es2017.typedarrays.d.ts 中的类型自己创建一个。

type TypedArray =
  | Int8Array
  | Uint8Array
  | Uint8ClampedArray
  | Int16Array
  | Uint16Array
  | Int32Array
  | Uint32Array
  | Float32Array
  | Float64Array;

回答你的第二个问题:并不是在浏览器中使用的每个集合都使用正确的数组实现。一些数据结构,如NodeListOfAggregateError,有不同的方法,但它们有一个相似之处——它们可以通过数字进行索引。您可以将ArrayLike视为用于描述这种对象的抽象类型。


1
请确保还包括BigInt64ArrayBigUint64Array,它们也是ES2020的类型化数组。 - undefined

3

1
ArrayBufferView不是所有类型化数组的超类型(联合类型),例如,它没有length属性。由于这种等价性的缺乏,我们无法执行以下操作: let a: ArrayBufferView, acc = 0; for(let i = 0; i < a.length; i++) acc += a[i]; 因为TS会抱怨ArrayBufferView没有length属性。 - Robert Monfera

1
如果您不喜欢使用ArrayBufferView,根据@tobenna的答案,唯一的选择是创建自己的TypedArray接口。
type TypedArray =
  | Int8Array
  | Uint8Array
  | Uint8ClampedArray
  | Int16Array
  | Uint16Array
  | Int32Array
  | Uint32Array
  | Float32Array
  | Float64Array;

注意:与ArrayBufferView方法不同,这不包括DataView对象。
最后,ArrayLike接口用于可以通过数字索引并具有长度的所有内容。这包括像DOM NodeList这样的东西,它不包含Array原型上的大多数方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接