如何告诉 Typescript lodash.filter() 使某些内容变为非空?

Sam*_*ing 1 typescript lodash

我最近开始使用 Typescript,并且使用严格模式。在很多情况下,我有一个可为空值的列表,并且我使用 _.filter() 来删除空值。例如,

const users: {id: number, name: string | null}[] = getUsers()
const lowerCaseNames = _(users)
  .filter(user => !!user.name)
  .map(user => user.name.toLowerCase())
  .value()
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为 Typescript 仍然认为 user.name 可以为 null,因此 user.name.toLowerCase() 无效。相反,我不得不将链拆分为多个变量并使用类型转换,这两者都是不幸的:

const users: {id: number, name: string | null}[] = getUsers()
const usersWithNames: {id: number, name: string}[] = _.filter(user => !!user.name) as {id: number, name: string}[]
const lowerCaseNames = _.map(usersWithNames, user => user.name.toLowerCase())
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以告诉 lodash/typescript.filter()在不进行类型转换或不破坏链的情况下摆脱空值?

谢谢!

Asa*_*viv 8

您可以在内部使用类型保护filter

type User = { id: number; name: string | null }

const haveName = (user: User): user is User & { name: string } => user.name !== null

const users: User[] = []

const lowerCaseNames = _(users)
  .filter(haveName)
  .map(user => user.name.toLocaleLowerCase())
  .value()
Run Code Online (Sandbox Code Playgroud)