TypeScript函数重载报No overload matches this call错误如何解决?
报错原因
TypeScript 函数重载的实现签名仅对内可见,对外暴露的只有你声明的两个重载签名:仅接收'a'返回字符串、仅接收'b'返回数字。你传入的mode是'a'|'b'联合类型,没有匹配的公开重载,因此触发报错。
解决方案
方案1:补充联合类型重载
在b函数的公开重载中新增接收联合类型的声明,既不会破坏原有单值入参的返回类型绑定,也能支持联合类型传参:
export function b (mode: 'a'): string export function b (mode: 'b'): number // 新增联合类型重载 export function b (mode: 'a' | 'b'): string | number export function b (mode: 'a' | 'b'): string | number { return (mode=='a') ? 'string' : 1; } // 此时a函数调用不会再报错 export function a (mode: 'a' | 'b') { return b(mode) }
方案2:使用泛型映射替代重载
如果不想维护多重重载,可通过泛型实现入参和返回值的类型绑定,可扩展性更强:
// 定义mode和返回值的映射关系 type ModeMap = { a: string b: number } // 泛型实现类型绑定 export function b<T extends keyof ModeMap>(mode: T): ModeMap[T] { return (mode === 'a' ? 'string' : 1) as ModeMap[T] } // a函数也可同步用泛型保证返回类型准确 export function a<T extends keyof ModeMap>(mode: T): ModeMap[T] { return b(mode) }
方案3:a函数内做类型收窄
如果不想修改b函数的现有定义,可在a函数内对入参做分支判断,TypeScript会自动收窄每个分支的mode类型,匹配对应重载:
export function a (mode: 'a' | 'b') { if (mode === 'a') { return b(mode) // 此时mode类型收窄为'a',匹配第一个重载 } return b(mode) // 此时mode类型收窄为'b',匹配第二个重载 }
内容的提问来源于stack exchange,提问作者David Min
相关产品推荐
相关产品推荐

