打字稿推断类型失败

时间:2021-06-08 19:49:51

标签: typescript

我正在使用打字稿版本 ^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。

1 个答案:

答案 0 :(得分:2)

我认为您应该将函数重写为更通用的:

function rmUserIdFromArr<T extends { userId: string }>(items: T[]): Omit<T, 'userId'>[] {
    return items.map((item) => {
        const { userId, ...newItem } = item;
        return newItem;
    });
}

playground link