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

如何解决TypeScript中函数重载与类型推断的匹配异常问题

解决TypeScript重载匹配问题

问题核心是User作为Person的超集,会被第二个重载的Person参数兼容,导致createLogin(user, { name: "" })能匹配到第二个重载。要避免这种情况,需要让第二个重载仅接受非User的Person类型。

解决方案代码

修改第二个重载的user参数类型,通过类型约束排除User:

type Person = {
  name: string;
  surname: string;
}

type User = Person & {
  username: string; 
}

// 定义仅属于Person的类型,排除带username的User
type OnlyPerson = Person & { username?: never };

function createLogin(user: User, value: { nickName: string }): string;
// 第二个重载使用OnlyPerson替代原Person类型
function createLogin(user: OnlyPerson, value: { name: string }): string;
function createLogin(user: any, value: any): string {
  return "It's not important";
}

const user: User = {
  name: "",
  surname: "",
  username: "",
};
const person: Person = {
  name: "",
  surname: "",
};

const result = createLogin(person, { name: "" }); // 正常匹配第二个重载
const result2 = createLogin(user, { name: "" }); // 现在会触发类型错误,符合预期
const result3 = createLogin(user, { nickName: "" }); // 正常匹配第一个重载

原理说明

  • OnlyPerson类型通过{ username?: never }限制:该类型要么没有username属性,要么username的类型为never(而User的username是string,因此User无法赋值给OnlyPerson)。
  • 调整后第二个重载仅接受纯粹的Person实例,User类型变量无法匹配该重载,从而在调用createLogin(user, { name: "" })时触发类型错误,实现预期的限制效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:03:19