You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在泛型函数中兼容处理Typed Array类型?

简洁实现泛型函数兼容Typed Array的方案

1. 用类型谓词统一识别Typed Array

不用为每种Typed Array写单独分支,先实现一个通用的类型判断函数,把所有Typed Array归为一类处理:

function isTypedArray(value: unknown): value is TypedArray {
  return typeof value === 'object' && value !== null 
    && 'BYTES_PER_ELEMENT' in value 
    && typeof (value as TypedArray).buffer === 'object';
}

之后在泛型函数里只需一个分支处理所有Typed Array,剩下的处理普通数组:

function processArray<T>(array: T[] | TypedArray): void {
  if (isTypedArray(array)) {
    // 统一处理所有Typed Array的逻辑,比如遍历、转换等
    console.log(`处理Typed Array,元素字节数:${array.BYTES_PER_ELEMENT}`);
    for (const item of array) {
      // 处理逻辑
    }
  } else {
    // 处理普通泛型数组的逻辑
    console.log('处理普通数组');
    array.forEach(item => { /* 处理逻辑 */ });
  }
}

2. 利用构造函数类型实现泛型创建

如果你的辅助函数需要创建Typed Array实例,可以通过泛型约束构造函数类型,兼容所有Typed Array的构造签名:

type TypedArrayConstructor<T extends TypedArray> = new (length: number) => T;

function createTypedArray<T extends TypedArray>(ctor: TypedArrayConstructor<T>, length: number): T {
  return new ctor(length);
}

// 使用示例
const intArray = createTypedArray(Int32Array, 10);
const floatArray = createTypedArray(Float64Array, 5);

3. 基于TS内置TypedArray接口做泛型约束

TypeScript内置了TypedArray接口,可直接作为泛型约束,让函数参数接受任意Typed Array类型,同时保留类型信息:

function mapTypedArray<T extends TypedArray, U>(
  array: T, 
  callback: (value: number, index: number) => U
): U[] {
  const result: U[] = [];
  for (let i = 0; i < array.length; i++) {
    result.push(callback(array[i], i));
  }
  return result;
}

// 使用示例
const int32Arr = new Int32Array([1, 2, 3]);
const strArr = mapTypedArray(int32Arr, num => num.toString());

这样就不用为Int32Array、Float64Array等每种类型单独写分支,完全符合泛型的复用理念。

内容的提问来源于stack exchange,提问作者Mike Lischke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 05:50:19