摆脱 TypeScript 转换中的未知

Getting rid of unknown in TypeScript casting

提问人:Igor Shmukler 提问时间:7/17/2023 更新时间:7/17/2023 访问量:50

问:

我写了下面的代码。

  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 的条目。isPreviouslyApprovedtrue

为了使类型检查通过,我必须将其转换为 .这应该不是必需的,因为会过滤掉。但是,打字稿检查器没有得到这个。至少,我是这样解释的。Array<ProviderRelationshipClaims | unknown>unknownArray<ProviderRelationshipClaims>filter(claim => !!claim)undefined

我怎样才能摆脱转换为 ,和/从而使这个代码片段更好 [更优雅]?有什么建议吗?unknown

谢谢

TypeScript 强制 转换 TSLint

评论

1赞 wonderflame 7/17/2023
请确保您提供的是最小的可重现示例。目前,您的代码片段缺少很多东西
0赞 Trevor Dixon 7/17/2023
过滤将摆脱未定义,但未知意味着它可以是任何东西。未知不是未定义。我们无法分辨未知来自哪里。
0赞 jcalz 7/17/2023
请考虑提供一个最小的可重现示例,我们可以按原样粘贴到我们自己的 IDE 中,以便有一些有形的东西可以使用,并且没有与您的问题无关的错误。现在它有很多未声明的变量和函数,所以我必须猜测它们的类型,并在我开始测试任何东西之前自己声明它们,然后其他人可能会做出不同的猜测。您能否编辑一下,为我们提供一些通用且可测试的东西,以便我们都在同一页面上?
0赞 Trevor Dixon 7/17/2023
顺便说一句,您可以使用 flatMap 而不是 map 然后过滤。
1赞 Dimava 7/17/2023
stackoverflow.com/questions/47632622/...能回答你的问题吗?

答:

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

我想这应该适用于大多数类型