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

如何避免handler.get额外调用'then'键以解析Proxy对象?

解决Proxy中'then'键的类型标注问题

问题出在你的get方法泛型约束仅包含ServiceKeys<T>,但Promise检测thenable对象时会读取'then'属性,该键不在你的服务键集合内,导致返回undefined时出现类型不匹配。可以通过以下方式修复:

1. 扩展键的类型范围

将key的类型从仅ServiceKeys<T>扩展为ServiceKeys<T> | 'then',让TypeScript识别'then'是合法的键输入。

2. 用条件类型定义返回值

根据键是否为'then'返回对应类型:当键是'then'时返回undefined,否则返回原请求函数类型。

修改后的代码如下:

get<K extends ServiceKeys<T> | 'then'>(
  target: { [ClientSymbol]: WsRpcClient<T> },
  key: K
): K extends 'then' 
  ? undefined 
  : (payload: ServiceRequest<T, K>) => PromiseResult<ServiceRespond<T, K>, ServiceError<T, K>> {
  if (key === 'then') {
    return undefined as K extends 'then' ? undefined : never;
  }
  // 断言key属于ServiceKeys<T>,已排除'then'分支
  const serviceKey = key as ServiceKeys<T>;
  return ((payload) => {
    return MakeWrapExt(target[ClientSymbol].request(serviceKey, payload));
  }) as K extends 'then' ? undefined : never;
}

关键说明

  • 泛型K覆盖服务键与'then',解决键类型不匹配问题
  • 条件类型让返回值类型与键严格关联,符合TypeScript的类型检查逻辑
  • 分支内的类型断言用于确认返回值符合条件类型要求,避免报错

这样既处理了Promise检测thenable的额外调用,又能正确标注所有场景的返回类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:30:45