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
相关产品推荐
相关产品推荐

