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

TypeScript对象结构间的高级类型推断问题求助

问题解决:基于解析器配置自动推断TypeScript类型

问题根源

你的类型推断失败有两个核心原因:

  1. 构造函数与实例类型混淆:ResolverResource中service是类的构造函数类型(Type<TService>),但serviceMethod定义为keyof TService(实例类型的键)。当你尝试访问T[P]['service'][T[P]['serviceMethod']]时,TypeScript会认为serviceMethod是构造函数的静态成员键,而非实例方法键,导致类型不匹配。
  2. 单一泛型限制:ResolvedData的TService泛型强制所有资源绑定到同一个服务类型,无法支持多服务场景,同时也阻碍了单个资源的独立类型推导。

修正后的类型定义

1. 调整ResolverResource接口

让泛型对应服务的构造函数类型,通过InstanceType关联实例方法:

import { Type } from '@angular/core'; // 若使用其他框架,可替换为`new () => any`
import { Observable } from 'rxjs';

// 泛型T为服务的构造函数类型
export interface ResolverResource<T extends new () => any> {
  service: T;
  // 从构造函数获取实例类型,再指定方法名
  serviceMethod: keyof InstanceType<T>;
}

2. 重构ResolvedData类型

使用infer推导每个资源的独立服务类型,避免单一泛型限制:

export type ResolvedData<T> = {
  [P in keyof T]: T[P] extends ResolverResource<infer TServiceCtor>
    // 从构造函数获取实例类型,再匹配方法的Observable返回值
    ? InstanceType<TServiceCtor>[T[P]['serviceMethod']] extends (...args: any[]) => Observable<infer U>
      ? U
      : never
    : never;
};

使用示例

// 基础类型定义
interface Order {
  id: string;
  name: string;
}

interface Cart {
  products: any[];
}

export class OrderService {
  public getOrders = (): Observable<Order[]> => {
    return of([ {id: '1', name: 'Order 1' }]);
  };

  public getCart = (): Observable<Cart> => {
    return of({ products: [] });
  };
}

// 配置对象(用as const保留字面量类型)
const resolverConfig = {
  orders: {
    service: OrderService,
    serviceMethod: 'getOrders' as const,
  },
  cart: {
    service: OrderService,
    serviceMethod: 'getCart' as const,
  },
} as const;

// 自动推断解析后的数据类型
type ParsedData = ResolvedData<typeof resolverConfig>;
// ParsedData最终类型:
// {
//   orders: Order[];
//   cart: Cart;
// }

关键修复点

  • 用InstanceType<T>从构造函数类型中提取实例类型,正确关联serviceMethod到实例方法。
  • 使用infer在遍历配置对象时,为每个资源独立推导对应的服务构造函数类型,提升灵活性。
  • 配置对象中添加as const,让TypeScript保留方法名的具体字面量类型,确保类型推断精度。

内容的提问来源于stack exchange,提问作者proxima-b

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 03:35:12