如何正确为TypeScript函数传递指定函数类型参数与对应入参
错误原因
TypeScript对函数联合类型做参数逆变推导时,为了保证类型安全,要求传入的参数必须同时满足联合中所有函数的参数要求。你定义的Func是(name:string)=>string和(age:number)=>number的联合,参数推导后得到的合法入参类型是string & number,也就是不存在的never类型,因此触发类型报错。
正确写法(函数重载方案,符合约束要求)
你可以通过函数重载显式限定仅允许两种合法的调用组合,完全符合「仅允许传入func1或func2类型」的要求:
function func1(name: string) { return name; } function func2(age: number) { return age; } type Func = typeof func1 | typeof func2; // 重载签名,限定仅支持两种调用场景 function func3(func: typeof func1, arg: string): string; function func3(func: typeof func2, arg: number): number; // 实现签名 function func3(func: Func, arg: string | number) { // 可选:增加类型收窄,保证运行时类型也安全 if (func === func1) { return func(arg as string); } return func(arg as number); } const x = func3(func1, 'hello'); // 自动推导为string类型 const y = func3(func2, 5); // 自动推导为number类型
这种写法下,如果传入非func1/func2的函数,或者参数类型和函数不匹配,TypeScript都会直接抛出错误,完全满足约束要求。
内容的提问来源于stack exchange,提问作者adam
相关产品推荐
相关产品推荐

