首页 > 解决方案 > TypeScript - 验证数组映射中的项目

问题描述

我有一个带有可选 id 的书的界面(如果是一本尚未保存到服务器的新书):

interface Book {
   id?: string
}

当我从后端获取所有书籍时 - 我用来创建一个对象 byId:

allIds: payload.map(book => book.id!),

其中allIds声明是:

allIds: string[]

如您所见,我在!后面添加了book.id以指定每本书都有一个 ID。好像我不会那样做,Typescript 不会编译:

TS2322:类型 '(string | undefined)[]' 不可分配给类型 'string[]'。

键入'字符串 | undefined' 不能分配给类型 'string'。

 类型“未定义”不可分配给类型“字符串”。

现在,它正在与 一起工作!,我不希望任何书丢失它的 ID,但我想找到一种优雅的方式来验证它.. 以防万一。

我可以做类似的事情:

allIds: payload.map(book => {
   if (!book.id) {
      throw new Error("invalid book id")
   }
   return book.id
}),

但我想知道您是否对更好的单线优雅解决方案有任何想法,以便在映射时验证项目。

标签: arraystypescriptvalidation

解决方案


我不希望任何书丢失它的 id

然后?从界面中删除。

如果您想过滤掉没有idso的元素,那么allIds将是所有字符串,并且如果您坚持使用单线:

const allStrings: string[] = payload.map(book => book.id).filter(<T>(v: T): v is Exclude<T, undefined> => typeof v !== 'undefined');

如果由于某种原因您无权访问Book接口,则可以将此类型用于传入数据:

Required<Book>

这将id不再是可选的。


推荐阅读