TypeScript箭头函数可变参数重载的优化实现求助
如何用箭头函数实现TypeScript函数重载(不使用any类型)
你可以利用TypeScript重载签名的约束特性简化实现逻辑——因为重载已经限定了调用时只能是「单个number参数」或者「三个number参数」,所以函数内部不需要额外的类型判断或错误抛出,编译阶段就会拦截不符合规则的调用。
优化后的代码如下:
interface DateGeneratorType { (timestamp: number): Date; (y: number, m: number, d: number): Date; } const dateFactory: DateGeneratorType = (yOrTs: number, m?: number, d?: number) => { // 当m和d都存在时,根据重载规则必然是number类型 if (m !== undefined && d !== undefined) { return new Date(yOrTs, m, d); } // 否则就是单个timestamp参数 return new Date(yOrTs); };
为什么这样可行?
- 重载接口
DateGeneratorType已经明确了两种合法调用方式,TypeScript会在编译时检查调用方的参数,不合法的调用(比如传2个参数)会直接报错,不会进入运行时。 - 函数内部给参数显式指定了类型,避免了
unknown错误,同时完全没有使用any。 - 去掉了冗余的错误抛出逻辑,因为不符合重载的调用根本到不了运行时。
如果想要更简洁的写法,也可以用三元表达式:
const dateFactory: DateGeneratorType = (yOrTs: number, m?: number, d?: number) => m !== undefined && d !== undefined ? new Date(yOrTs, m, d) : new Date(yOrTs);
内容的提问来源于stack exchange,提问作者young
相关产品推荐
相关产品推荐

