如何为TypeScript对象方法添加正确类型标注并实现良好的函数类型推断
解决TypeScript对象方法类型推断为
any的问题 这个问题的核心在于你给foo方法的参数R用了Function类型——这个类型太宽泛了,TypeScript无法从中提取出函数的输入输出类型信息,自然只能把返回值推断为any。我们只需要给P和它返回的foo方法加上更精确的泛型类型标注,就能让TypeScript正确追踪类型了。
修改后的代码
// 给P添加泛型T,同时给foo方法添加泛型U来捕获R的返回类型 const P = <T>(x: T) => ({ foo: <U>(R: (arg: T) => U) => R(x) }); const f = (a: number) => a + 1; const g = (a: number) => a.toString(); const p1 = f(5); // const p1: number const p2 = g(5); // const p2: string const q1 = P(5).foo(f); // const q1: number ✅ 类型推断正确 const q2 = P(5).foo(g); // const q2: string ✅ 类型推断正确
为什么这样能解决问题?
P<T>(x: T):明确了传入的x的类型是T,这个类型会被后续的foo方法复用。foo<U>(R: (arg: T) => U):这里的泛型U专门用来捕获函数R的返回类型,同时我们明确了R必须接收一个T类型的参数(也就是P传入的x的类型)。这样TypeScript就能完整追踪从x到R再到返回值的类型链条,不再丢失类型信息。
如果你习惯用['foo']的属性访问方式,修改后的代码同样能正常工作:
const q1 = P(5)['foo'](f); // 依然能正确推断为number类型
内容的提问来源于stack exchange,提问作者Functor
相关产品推荐
相关产品推荐

