如何在泛型函数中兼容处理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
相关产品推荐
相关产品推荐

