arrays - 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
}),
但我想知道您是否对更好的单线优雅解决方案有任何想法,以便在映射时验证项目。
解决方案
我不希望任何书丢失它的 id
然后?
从界面中删除。
如果您想过滤掉没有id
so的元素,那么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
不再是可选的。
推荐阅读
- c# - 仅当整数的二进制表示的位数大于给定值时才移位整数的位
- python - Json 到 CSV,具有动态和复杂的 json
- python - 如何更新井字棋盘中的值
- c++ - 如何声明一个可以接受任何大小的二维向量参数?
- angular-universal - 如何将 ng-flexmonster 与 Angular Universal 一起使用?
- d3.js - Y轴不显示
- swift - 在 Swift 中使用递归打印模式
- admob - 将 AdMob AdUnit 转让给其他开发者
- firebase - 使用 firestore 验证后不显示错误消息
- python - 我怎样才能为这个问题编写代码?