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

TypeScript中两种柯里化泛型类型X1与X2的具体差异是什么

TypeScript 两种柯里化泛型定义的差异

核心差异是泛型参数的绑定时机不同,直接决定了类型推导的灵活性:

1. 定义1:type X1 = <A, B extends A>(a: A) => (b: B) => void

  • 两个泛型参数A和B会在第一次调用外层函数时就全部完成绑定,调用内层返回函数时无法再修改B的类型。
  • 实际使用示例:
const fn1: X1 = (a) => (b) => {}
// 调用外层函数时,A和B必须同时确定,没有手动指定的话TS会无法推导B的具体类型
const getBfn1 = fn1<number, 100>(10)
// 此时内层函数的参数b只能是100,传入其他符合A(number)类型的值都会报错
getBfn1(100) // 合法
getBfn1(200) // 报错,类型不匹配

2. 定义2:type X2 = <A>(a: A) => <B extends A>(b: B) => void

  • 泛型参数分两个阶段绑定:调用外层函数时仅绑定A的类型,B的类型会推迟到调用内层返回函数时才根据传入的参数动态推导绑定。
  • 实际使用示例:
const fn2: X2 = (a) => (b) => {}
// 调用外层函数时仅确定A为number,B还未绑定
const getBfn2 = fn2(10)
// 调用内层函数时才会根据传入的值动态推导B的类型
getBfn2(20) // 合法,B推导为字面量类型20
getBfn2(30) // 合法,B推导为字面量类型30
// 只要是符合A extends约束的类型都可以传入,灵活性远高于X1

适用场景差异

  • 如果需要在传入第一个参数时就固定第二个参数的可选类型范围,选X1
  • 如果需要第二个参数的类型可以根据实际传入值动态收窄,这是更通用的柯里化泛型写法,选X2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:27:03