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正确推断出item
为A|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
。