有没有办法告诉typescript是否传入数组我希望返回一个数组

时间:2018-02-19 11:10:18

标签: arrays typescript

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

尽管事实上当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])不应出现类型错误?也许某种类型的泛型魔术?

您可以使用上面的代码快速复制打字稿操场中的错误。 https://www.typescriptlang.org/play/index.html

1 个答案:

答案 0 :(得分:3)

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

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);
  }
}