提问人:Igor Shmukler 提问时间:7/17/2023 更新时间:7/17/2023 访问量:50
摆脱 TypeScript 转换中的未知
Getting rid of unknown in TypeScript casting
问:
我写了下面的代码。
const incompleteKYCClaims = completedProvidersWithoutStripeAccount.map( async (p) => {
const provider = await getProviderOrThrow(p.tin)
const isPreviouslyApproved = previouslyApproved.includes(provider.status)
if (isPreviouslyApproved) return
return toProviderRelationshipClaims({tin: p.tin, role: ProviderUserSubRoles.ky, status: 'KYCInDraft'})
}).filter(claim => !!claim) as unknown as Array<ProviderRelationshipClaims>
它将一个数组映射到另一个数组,跳过 is 的条目。isPreviouslyApproved
true
为了使类型检查通过,我必须将其转换为 .这应该不是必需的,因为会过滤掉。但是,打字稿检查器没有得到这个。至少,我是这样解释的。Array<ProviderRelationshipClaims | unknown>
unknown
Array<ProviderRelationshipClaims>
filter(claim => !!claim)
undefined
我怎样才能摆脱转换为 ,和/从而使这个代码片段更好 [更优雅]?有什么建议吗?unknown
谢谢
答:
1赞
Max
7/17/2023
#1
认为向筛选器添加返回类型将适合您。
如果我理解这个问题,它基本上就像这个例子一样,对吧?
const arr = [1, 2, 3, undefined, 4];
const filtered = arr.filter(x=>x!==undefined); //(number | undefined)[] ..
但应该是数字数组。
如果你这样做
const filtered = arr.filter((x):x is number=>x!==undefined); //number[]
然后你得到数字数组。
因此,对于您的代码,如果您知道类型,则可以执行
.filter((claim): claim is ProviderRelationshipClaims => !!claim)
假设是 undefined 以外的类型。ProviderRelationshipClaims
否则我认为你可以这样做
arr.filter(<T extends unknown>(z:T): z is Exclude<T,undefined> => z !== undefined);
我想这应该适用于大多数类型
评论