TypeScript指定类型函数如何设置参数默认值满足类型校验需求
问题原因
你当前的写法错误根源在于MyFunc的类型定义强制要求参数是必传的string类型,即便你在函数实现中给参数加了默认值,TypeScript会优先使用你标注的变量类型MyFunc做校验,会忽略实现里的默认值带来的参数可选特性,所以两个函数调用时不传参数都会触发类型错误,不符合你的预期。
可行解决方案
方案1:拆分两种函数子类型
你可以根据参数是否可选,拆分出两个子类型,二者都符合「输入string返回number」的基础约束,分别给两个函数做类型标注:
// 必传参数的函数类型 type MyFuncRequired = (str: string) => number; // 可选参数的函数类型 type MyFuncOptional = (str?: string) => number; const myAFunc: MyFuncRequired = (str) => Number(str); const myBFunc: MyFuncOptional = (str = '9999') => Number(str); myAFunc('a'); myAFunc(); // 符合预期触发报错 myBFunc('b'); myBFunc(); // 符合预期不触发报错
如果需要统一封装这两类函数,可以用联合类型定义通用的MyFunc:
type MyFunc = MyFuncRequired | MyFuncOptional;
方案2:用泛型动态适配参数特性
如果希望统一约束函数的返回值必须为number,同时自动适配参数的可选性,可以用泛型实现:
type MyFunc<T extends (str?: string) => number> = T; // 显式指定参数为必传 const myAFunc: MyFunc<(str: string) => number> = (str) => Number(str); // 显式指定参数为可选,配合默认值使用 const myBFunc: MyFunc<(str?: string) => number> = (str = '9999') => Number(str); myAFunc('a'); myAFunc(); // 触发报错 myBFunc('b'); myBFunc(); // 不触发报错
内容的提问来源于stack exchange,提问作者grace
相关产品推荐
相关产品推荐

