【问题标题】:Typescript inferring type fails打字稿推断类型失败
【发布时间】:2021-06-08 19:49:51
【问题描述】:

我正在使用 typescript 版本 ^4.1.3 并且有一个包含专辑和艺术收藏的 REST API。在将请求响应发送到 Web 客户端之前,我从集合中删除了 userId。

请查看我的 DynamoDB 表中的 Album 和 Arts 接口,以及从集合对象中删除 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;创建日期:字符串;可见性:>相册可见性;标题:字符串;描述:字符串;封面网址:字符串; } | { 专辑 ID:字符串; >artId:字符串;序列号:数字;创建日期:字符串;标题:字符串;描述:字符串; >imgUrl:字符串; }'。 类型 '{ albumId: string; 上不存在属性 'artId'创建日期:字符串;可见性:>相册可见性;标题:字符串;描述:字符串;封面网址:字符串; }'.ts(2339)

这对我来说很奇怪,因为 artId 存在于 Art 接口类型中。

我在这里遗漏了什么吗?我知道我可以解决将地图功能中的项目设置为 item: any 的问题,但我想知道是否有更好的方法来解决这个问题。

const arts = rmUserIdFromArr(result.items).map((item: any) => ({

非常感谢, BR。

【问题讨论】:

  • 请考虑修改这个问题中的代码以构成一个minimal reproducible example,当它被放入像The TypeScript Playground这样的独立IDE中时,清楚地展示了您面临的问题(所以没有未声明的类型或值;唯一存在的错误应该是您要询问的错误)。这将使那些想要帮助您的人立即着手解决问题,而无需首先重新创建它。它将使您得到的任何答案都可以针对定义明确的用例进行测试。
  • 如果内部映射迭代 item 具有类型 Album 会发生什么?

标签: typescript


【解决方案1】:

我相信你应该将你的函数重写为更通用的东西:

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

playground link

【讨论】:

  • 不错的解决方案!!
  • 非常感谢@aleksxor。非常好的解决方案,它奏效了!
猜你喜欢
  • 2016-08-03
  • 2021-01-03
  • 1970-01-01
  • 2018-06-09
  • 2020-04-02
  • 2020-12-20
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多