如何在TypeScript重载函数中设置参数默认值?
如何在TypeScript重载函数中设置参数默认值?
嘿,我太懂你遇到的这个报错了!你现在的问题出在把参数默认值写在了重载签名里——TypeScript的规则很明确:那些不带函数体的重载签名,只是用来告诉类型系统「这个函数支持哪些参数组合」,它们根本不负责处理实际的参数默认值逻辑,所以你在重载签名里加=1肯定会触发那个报错。
那正确的写法应该怎么搞呢?分两步来调整:
- 先写重载签名,只定义参数的类型约束,把
level改成可选参数(加?),这样TypeScript就知道调用时可以不传这个参数:
// 重载签名:只声明合法的参数-返回值类型组合,不带默认值 function indented(input: string, level?: number): string; function indented(input: string[], level?: number): string[];
- 然后写实际实现的函数,在这里才加参数默认值,同时完成你的缩进逻辑——对了,顺便提一句,你原来用
for (const line in lLines)是在遍历数组的索引字符串哦,应该改成for...of来遍历数组元素,不然会拿到"0"、"1"这种索引值,容易出问题:
// 实现函数:这里才写默认值和实际逻辑 function indented(input: string | string[], level: number = 1): string | string[] { const lLines: string[] = Array.isArray(input) ? input : input.split('\n'); const lNewLines: string[] = []; for (const line of lLines) { lNewLines.push(' '.repeat(level) + line); } // 根据输入类型返回对应格式的结果 return Array.isArray(input) ? lNewLines : lNewLines.join('\n'); }
这样改完之后,不管你是调用indented('hello world')(自动用默认的level=1),还是indented(['first line', 'second line'], 2)(指定level=2),都能正常工作,而且TypeScript的类型检查也能完美适配。
简单总结一下:重载签名管「类型约束」,实现函数管「实际逻辑+默认值」,把两者的职责分开就不会踩这个坑啦!
备注:内容来源于stack exchange,提问作者John Deighan
相关产品推荐
相关产品推荐

