下面的打字稿代码显示从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
答案 0 :(得分:3)
您严格为string
变量设置result
类型,但getName
返回string | string[]
且不能分配给string
。您需要使用getName
和string
参数重载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);
}
}