typescript 重载签名问题?

function getMessage(value: number, myName: string): Message | undefined
function getMessage(value: messageType, readRecordCount: number): Message[]
function getMessage(value: any, readRecordCount: number = 1, myName: string = "2"): Message | Message[] | undefined {
  console.log(myName);

  if (typeof value === "number") {
    return messages.find(item => item.id === value)
  } else {
    return messages.filter(item => item.type === value).splice(0, readRecordCount)
  }
}

这里的第一个 getMessage 重载签名为什么与实现签名不兼容 我已经给值并且赋值初始值了

阅读 1.8k
2 个回答

因为 TypeScript 是按照参数的序号来确定参数的,或者说这些参数都不是命名参数。
你的第一个重载里面,myName 是第二个参数,对应的是函数实现的readRecordCount,所以实际上 readRecordCount 的类型应当为 string|number,后面那个参数则是多余的。

如果你要在 TS/JS 中使用命名参数的话,可以使用对象来传参:

function getMsg(args: { value: number, myName: string }): Message | void;
function getMsg(args: { value: number, readRecordCount: number }): Message[];
function getMsg(
  {
    value,
    readRecordCount = 1,
    myName = ""
  }:
  {
    value: number,
    readRecordCount?: number,
    myName?: string
}){
  // codes here
}

声明中的第一个重载,函数签名是 (number, string) => Message | undefined
第二个重载,签名是 (messageType, number) => Message[]

所以实现必须要包含这些参数类型(按顺序)和返回类型,就是

(number | messageType, string | number) => Message[] | Message | undefined

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏