【问题标题】:Is there a way to tell typescript if an array is passed in I want an array returned有没有办法告诉打字稿是否传入了一个数组我想要返回一个数组
【发布时间】:2018-02-19 19:28:41
【问题描述】:

下面的打字稿代码显示从getName(personA) 分配给result 时的类型错误以及通过getName([personA, personB]) 调用分配[nameA, nameB] 时的类型错误。

尽管getName() 接收到对象输入时,返回值是一个字符串,而当getName 调用接收到对象输入的数组时,返回值始终是数组。由于Array.isArray(data) 检查。

const personA = {
    name: "person A"
}

const personB = {
    name: "person B"
}

function getName(data: object | object[]): string | string[] {
    if (Array.isArray(data)) { 
        return data.map(extractName)
    } else {
        return extractName(data)
    }
}

function extractName(object): string {
    return object.name
}

// shows a type error 
const result: string = getName(personA)

// shows type error
const [nameA, nameB] = getName([personA, personB])

有没有教打字稿const result: string = getName(personA)const [nameA, nameB] = getName([personA, personB]) 不应该显示类型错误?也许某种类型的泛型魔法?

您可以使用上面的代码在 typescript playground 中快速复制错误。 https://www.typescriptlang.org/play/index.html

【问题讨论】:

标签: arrays typescript


【解决方案1】:

您为result 变量严格设置string 类型,但getName 返回string | string[] 并且它不能分配给string。您需要使用 stringstring[] 参数重载 getName 函数,例如

function getName(data: object): string;
function getName(data: object[]): string[];
function getName(data: object | object[]): string | string[] {
  if (Array.isArray(data)) {
    return data.map(extractName);
  } else {
    return extractName(data);
  }
}

【讨论】:

  • 谢谢。超载!正是我需要的。出于某种原因,function getName(data: object[]): string[]; 重载需要高于function getName(data: object): string;
猜你喜欢
  • 2021-10-15
  • 1970-01-01
  • 2019-11-10
  • 2017-02-21
  • 2020-09-26
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多