如何避免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
相关产品推荐
相关产品推荐

