用于联合对象数组迭代的正确类型保护


type A = ~~;
type B = ~~;
type C = ~~;
function isA(a: string) a is A{
return a in A
}

我有三个类型或enum,我想迭代数组U来创建另一个数组。

const arr1 = A|B|C[] // array that item's type is A|B|C
const arr2 = arr1.map(item=>{
if(isA(item)){
return {a: 1};
}
if(isB(item)){
return {b:1};
}
if(isC(item)){
return {c:1}
}
}

IDE正确推断出itemA|B|C的映射值

问题是,当我使用if状态做typeguard时,结果数组项类型包含'undefined'类型。

arr2 = ({a:1}|{b:1}|{c:1}|undefined)[]//like this

无论如何我可以提示typescript项不包含未定义的值??

您有一个谓词返回undefined(当item不是a, B或C时)的情况:

const arr2 = arr1.map(item=>{
if(isA(item)){
return {a: 1};
}
if(isB(item)){
return {b:1};
}
if(isC(item)){
return {c:1}
}
}

TS认为它可能返回undefined。要断言不应该,可以抛出一个错误:

const arr2 = arr1.map(item=>{
if(isA(item)){
return {a: 1};
}
if(isB(item)){
return {b:1};
}
if(isC(item)){
return {c:1}
}
throw new Error("Why did this happen?");
}

现在返回类型是A | B | C | never,简化为A | B | C

相关内容

  • 没有找到相关文章

最新更新