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

定义带参数注入的TypeScript泛型遇类型错误,求解决方案

解决TypeScript柯里化函数的类型不兼容问题

问题核心在于原泛型定义中,A被约束为包含bar: string的类型,这意味着f的参数可能期望bar是更具体的子类型(比如字面量类型"specific-bar"),但我们注入的是通用string类型,导致类型不匹配。要让f必须接受任意string类型的bar,需要调整泛型的定义方式:

正确的类型与实现

type Example = <A, R>(
  f: (a: A & { bar: string }) => R,
) => (a: A) => R;

const example: Example = (f) => (a) => f({ ...a, bar: 'bar' });

逻辑解释

  • 泛型A不再包含bar属性,专门代表参数对象中除bar外的所有属性类型。
  • f的参数类型明确为A & { bar: string },强制f必须接受任意string类型的bar,同时允许A包含任意其他属性。
  • 返回的函数接收a: A(即缺少bar的参数对象),注入bar: 'bar'后,完全符合f的参数类型要求,不会再出现类型错误。

验证示例

调用时,f可以接受任意string类型的bar,但其他属性可以定义具体类型:

// 合法:f接受bar为任意string,foo为number
const result = example(({ foo, bar }) => `${foo}-${bar}`)({ foo: 123 });
console.log(result); // 输出 "123-bar"

// 非法:如果f试图约束bar为特定字面量类型,TypeScript会直接报错
example(({ bar }: { bar: "only-this" }) => bar)({});
// 类型错误:类型 '{ bar: string; }' 不能赋值给类型 '{ bar: "only-this"; }'

这样就严格满足了需求:限制f无法对bar定义特殊子类型约束,必须接受任意string,同时允许f对其他属性做任意类型定义。

内容的提问来源于stack exchange,提问作者cyberixae

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:10:44