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

