You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeScript重载函数中设置参数默认值?

如何在TypeScript重载函数中设置参数默认值?

嘿,我太懂你遇到的这个报错了!你现在的问题出在把参数默认值写在了重载签名里——TypeScript的规则很明确:那些不带函数体的重载签名,只是用来告诉类型系统「这个函数支持哪些参数组合」,它们根本不负责处理实际的参数默认值逻辑,所以你在重载签名里加=1肯定会触发那个报错。

那正确的写法应该怎么搞呢?分两步来调整:

  1. 先写重载签名,只定义参数的类型约束,把level改成可选参数(加?),这样TypeScript就知道调用时可以不传这个参数:
// 重载签名:只声明合法的参数-返回值类型组合,不带默认值
function indented(input: string, level?: number): string;
function indented(input: string[], level?: number): string[];
  1. 然后写实际实现的函数,在这里才加参数默认值,同时完成你的缩进逻辑——对了,顺便提一句,你原来用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 17:25:33