TypeScript:如何为通用迭代器的map函数定义泛型类型?
解决TypeScript通用迭代器类型的map返回类型问题
要让GeneralIterator兼容你的MyOwnIterator,核心是让GeneralIterator的第二个泛型参数表示一个可接受类型参数的泛型迭代器类型,而不是具体的非泛型类型。以下是两种可行的实现方式:
方式一:利用高阶泛型类型(TypeScript 4.7+)
直接将IteratorType定义为一个泛型类型,让它接受类型参数生成具体的迭代器实例类型:
// 定义通用迭代器类型,IteratorType是一个泛型类型(如MyOwnIterator) type GeneralIterator<DType, IteratorType<T>> = { map: <T>(func: (item: DType) => T) => IteratorType<T>; }; // 让MyOwnIterator兼容该类型 type MyOwnIteratorCompat<DType> = GeneralIterator<DType, MyOwnIterator>; // 验证兼容性 const iter = new MyOwnIterator([1, 2, 3]); const compatIter: MyOwnIteratorCompat<number> = iter; // 编译通过,完全兼容
方式二:约束泛型构造函数
如果需要兼容更低版本的TypeScript,可以通过约束IteratorType为泛型构造函数,再通过InstanceType获取实例类型:
// 定义泛型构造函数的约束:接受T[]参数,返回对应迭代器实例 type GenericIteratorCtor = new <T>(data: T[]) => { map: <U>(func: (item: T) => U) => any; }; // 定义通用迭代器类型 type GeneralIterator<DType, IteratorType extends GenericIteratorCtor> = { map: <T>(func: (item: DType) => T) => InstanceType<IteratorType<T>>; }; // 兼容MyOwnIterator type MyOwnIteratorCompat<DType> = GeneralIterator<DType, typeof MyOwnIterator>; // 验证 const iter = new MyOwnIterator([1, 2, 3]); const compatIter: MyOwnIteratorCompat<number> = iter; // 编译通过
两种方式都能解决"IteratorType不是泛型"的错误,核心是让GeneralIterator能够识别IteratorType是一个可以接受类型参数的泛型结构,从而正确推导map函数的返回类型。
内容的提问来源于stack exchange,提问作者Zumars
相关产品推荐
相关产品推荐

