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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:24:03