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

如何修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:24:02