定义带参数注入的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
相关产品推荐
相关产品推荐

