TypeScript如何实现支持多路径段的IReference泛型获取正确返回类型
解决方案
你可以通过递归工具类型+剩余参数泛型实现多路径段的类型自动推导,修改后的完整代码如下:
// 递归工具类型:根据路径数组获取目标对象对应位置的类型 type DeepIndex<T, Path extends any[]> = Path extends [infer FirstSegment, ...infer RestSegments] ? FirstSegment extends keyof T ? DeepIndex<T[FirstSegment], RestSegments> : never : T; export interface IReference<T> { // 支持任意长度的路径段入参,自动推导最终引用类型 property<Path extends any[]>(...path: Path): IReference<DeepIndex<T, Path>>; value(): T extends (...args: any) => any ? any : Promise<T>; } // 测试验证 const data = { foo: { bar: { value: 'foobar' }}} declare const ref0: IReference<typeof data> const ref1 = ref0.property('foo', 'bar', 'value') const value = await ref1.value() // 类型自动推导为string
实现说明
DeepIndex工具类型会逐段校验路径合法性,递归匹配每一层的对象属性类型,路径遍历完成后返回最终属性的类型property方法通过剩余参数泛型接收任意长度的路径段,将路径传入DeepIndex得到目标类型后,包装为IReference实例返回- 调用
value()时会沿用原有逻辑,自动返回对应类型的Promise,函数类型的特殊处理逻辑也可以正常生效
内容的提问来源于stack exchange,提问作者David Alsh
相关产品推荐
相关产品推荐

