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

TypeScript重载函数返回类型推断异常原因咨询

TypeScript重载函数返回类型推断受顺序影响的原因

问题场景

以下代码中,TA是包含TB所有属性的子类型:

type TA = {
    a: number,
    b: number,
}

type TB = {
    b: number,
}

// 先声明TB的重载,再声明TA的重载
function fn(arg: TB): string
function fn(arg: TA): number
function fn(arg: any) {
    return 1 as any;
}

const myArg: TA = {
    a: 10,
    b: 20
}
const result = fn(myArg) // 推断类型为string,不符合预期

调换两个重载声明的顺序后,result的推断类型会变为number。

原因解释

TypeScript的重载解析逻辑是从上到下依次匹配重载签名:

  • TypeScript采用结构类型系统,TA类型的变量可以赋值给TB类型(因为TA拥有TB的所有属性,满足TB的类型约束)。
  • 当调用fn(myArg)时,TypeScript会先检查第一个重载签名fn(arg: TB): string,发现myArg可以赋值给TB类型,就直接匹配该重载,不会继续检查后续更精确的TA重载,因此返回类型被推断为string。
  • 调换重载顺序后,第一个签名是fn(arg: TA): number,myArg直接匹配该签名,返回类型就变为number。

解决方法

将更精确、更具体的重载签名放在前面,确保TypeScript优先匹配最贴合的类型:

type TA = {
    a: number,
    b: number,
}

type TB = {
    b: number,
}

// 先声明TA的重载(更精确),再声明TB的重载
function fn(arg: TA): number
function fn(arg: TB): string
function fn(arg: any) {
    return 1 as any;
}

const myArg: TA = {
    a: 10,
    b: 20
}
const result = fn(myArg) // 推断类型为number,符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 19:52:40