我正在使用打字稿版本 ^4.1.3,并且有一个包含专辑和艺术收藏的 REST API。在向 Web 客户端发送请求响应之前,我从集合中删除了 userId。
请从 DynamoDB 表中查看我的专辑和艺术界面,以及从集合对象中删除 userId 属性的实用方法。
export interface Album {
userId: string;
albumId: string;
creationDate: string;
visibility: AlbumVisibility;
title: string;
description: string;
coverUrl: string;
}
export interface Art {
albumId: string;
artId: string;
sequenceNum: number;
userId: string;
creationDate: string;
title: string;
description: string;
imgUrl: string;
}
export function rmUserIdFromArr(items: Album[] | Art[]) {
return items.map((item: Album | Art) => {
const { userId, ...newItem } = item;
return newItem;
});
}
但是当我在一组艺术项目中运行代码时,Typescript 抱怨:
const arts = rmUserIdFromArr(result.items).map((item) => ({
...item,
imgUrl: getDownloadSignedUrl(getFsArtsFolder(item.albumId), item.artId),
}));
<块引用>
属性 'artId' 不存在于类型 '{ albumId: string;创建日期:字符串;可见性:>相册可见性;标题:字符串;描述:字符串; coverUrl: 字符串; } | {专辑ID:字符串; >artId:字符串;序列号:编号;创建日期:字符串;标题:字符串;描述:字符串; >imgUrl:字符串; }'。 属性 'artId' 不存在于类型 '{albumId: string;创建日期:字符串;可见性:>相册可见性;标题:字符串;描述:字符串; coverUrl: 字符串; }'.ts(2339)
这对我来说很奇怪,因为artId存在于Art接口类型中。
我在这里遗漏了什么吗?我知道我可以解决将 map 函数中的项目设置为 item: any 的问题,但我想知道是否有更好的方法来解决这个问题。
const arts = rmUserIdFromArr(result.items).map((item: any) => ({
非常感谢, BR。
答案 0 :(得分:2)
我认为您应该将函数重写为更通用的:
function rmUserIdFromArr<T extends { userId: string }>(items: T[]): Omit<T, 'userId'>[] {
return items.map((item) => {
const { userId, ...newItem } = item;
return newItem;
});
}