TypeScript实现spread操作符时无法推断可迭代对象底层类型问题
问题根因
TypeScript 的泛型推断逻辑不会从类型约束中反向推导参数类型。你当前写的spread函数签名中,R仅出现在T的约束语句T extends Iterable<R>里,调用时如果没有显式传入泛型参数,TS 无法从T的实际类型反向解析出对应的R,就会默认将R推导为unknown。
修复方案
你可以通过条件类型+infer语法,直接从外层可迭代对象的元素类型里提取内层元素类型,不需要把R单独声明为泛型参数:
// 工具类型:提取可迭代对象的元素类型 type IterableElement<T> = T extends Iterable<infer R> ? R : never; function spread<T extends Iterable<any>>(): Output<T, IterableElement<T>> { return (iterable: Iterable<T>) => ({ [Symbol.iterator](): Iterator<IterableElement<T>> { return null as any; // 临时占位实现 } }); }
效果验证
修改后两个测试用例都可以得到预期的类型推导结果:
pipe(['text'], spread())会正确推导返回Iterable<string>pipe([[1, 2], [3, 4]], spread())会正确推导返回Iterable<number>
这个写法同时兼容字符串、数组等所有标准可迭代类型的推导,符合最初的设计需求。
内容的提问来源于stack exchange,提问作者vitaly-t
相关产品推荐
相关产品推荐

