如何过滤打字稿中的对象数组,以便仅保留包含可选键的对象(并且知道打字稿)?

时间:2019-08-17 19:48:33

标签: javascript typescript

这与带有严格null检查的打字稿有关。假设您有一个界面,例如:

interface Name {
  firstName?: string;
  lastName?: string;
}

您有一个Name[]数组。

如何以打字稿将知道firstName存在的方式过滤此数组?例如:

names.filter(name => !!name.firstName).map(name => {
  // inside here, typescript still thinks name.firstName is possibly undefined
  // but it should be aware that we have already filtered out elements with an
  // undefined firstName
})

1 个答案:

答案 0 :(得分:3)

filter接受可以作为类型防护的函数。 Typescript不会推断函数的类型保护,但是您可以将返回类型显式定义为类型保护:


interface Name {
  firstName?: string;
  lastName?: string;
}
declare const names: Name[];
names
    .filter((name): name is Name & { firstName: string } => !!name.firstName)
    .map(name => {
        name.firstName.big()
    });


Play

上面我们定义了name参数为Name,但是使用交集我们添加了firstName是必需的。语法有点冗长,但可以。