如何修复Typescript中基于可选参数的函数返回类型错误?
问题原因
TypeScript 函数重载采用从上到下匹配规则,原定义将宽泛的重载放在了最前面,所有带options参数的调用都会优先命中第二个返回X<Obj>的重载,不会走到带action判断的分支,导致返回类型不符合预期。
修复方案
调整重载顺序,将最具体的带action参数的重载放在最前面,宽泛的重载放在后面:
interface X<T> { abc:T } // 1. 最具体:处理带action属性的配置场景 declare function deepLock< Obj extends Record<string, any>, Action extends "freeze" | "seal" | "preventExtensions", >(obj: Obj, options: { action: Action }): Action extends 'freeze' ? X<Obj> : Obj // 2. 无参数场景 declare function deepLock<Obj extends Record<string, any>>(obj: Obj): X<Obj>; // 3. 空配置对象场景 declare function deepLock<Obj extends Record<string, any>>(obj: Obj, options: {}): X<Obj>;
验证效果
修改后所有调用的返回类型都符合预期:
const x = deepLock({})→ 返回X<{}>const x2 = deepLock({}, {})→ 返回X<{}>const x3 = deepLock({}, {action: 'freeze'})→ 返回X<{}>const x4 = deepLock({}, {action: 'seal'})→ 返回原对象类型const x5 = deepLock({}, {action: 'preventExtensions'})→ 返回原对象类型
内容的提问来源于stack exchange,提问作者ZiiMakc
相关产品推荐
相关产品推荐

