TypeScript泛型方法报错:对象字面量含未知属性如何解决?
问题原因
你的foo函数泛型参数定义顺序有问题,TypeScript 推导泛型时会按从左到右的顺序推导:你把O extends Obs<T>放在第一位,T放在第二位,推导O的时候T还未被赋值,会被默认推导为unknown,此时参数的预期类型就被收窄为固定的Obs<unknown>,对象字面量传入时触发额外属性检查,检测到reset不在Obs<unknown>的定义中就抛出错误。
而代码片段B中Obs<T>只有属性没有方法,TS 可以更快从属性反推T的类型为number,不会出现T被推导为unknown的情况,因此校验正常。
解决方案
最简单的调整方式是修改foo的泛型定义,不需要拆分O和T两个泛型,直接约束泛型继承任意Obs类型即可:
type Obs<T> = { x: T; set: (x: T) => T } function createObs<T>(x: T): Obs<T> { return { x, set: (val: T) => val } } // 仅声明一个泛型,约束为继承Obs<any>,TS会自动推导传入对象的完整类型 function foo<O extends Obs<any>>(a: O) {} const a = createObs(1) foo({ ...a, reset: () => 1 }) // ✅ 正常运行
如果你需要明确拿到T的类型做后续逻辑,也可以调整泛型参数的顺序,把T放在第一位优先推导:
function foo<T, O extends Obs<T>>(a: O) {}
内容的提问来源于stack exchange,提问作者david_adler
相关产品推荐
相关产品推荐

