首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解决__typename联合

解决__typename联合
EN

Stack Overflow用户
提问于 2019-05-23 13:11:44
回答 1查看 410关注 0票数 1

假设我有一个工会:

代码语言:javascript
复制
export type IBookmarkItemFragment =
  | ({ __typename: "Story" } & {
      story: number;
    })
  | ({ __typename: "Product" } & {
      product: number;
    })
  | ({ __typename: "Project" } & {
      project: number;
    });

我要.filter.map基于__typeame。类似于:

代码语言:javascript
复制
bookmarks
  .filter(bookmark => {
    return bookmark.__typename === "Project";
  })
  .map(project => {
    return project.project;
  });

如何确保在地图中project将解析为:

代码语言:javascript
复制
({ __typename: "Project" } & {
  project: number;
})
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-23 13:18:35

您必须显式声明该函数是一个带有注释的类型保护:

代码语言:javascript
复制
export type IBookmarkItemFragment =
| ({ __typename: "Story" } & {
    story: number;
    })
| ({ __typename: "Product" } & {
    product: number;
    })
| ({ __typename: "Project" } & {
    project: number;
    });

declare let bookmarks: IBookmarkItemFragment[]
bookmarks
.filter((bookmark):bookmark is Extract<IBookmarkItemFragment, { __typename: "Project"}>   => {
    return bookmark.__typename === "Project";
})
.map(project => {
    return project.project;
});

或者只是为了好玩,如果我们想概括类型保护,我们可以创建一个警卫工厂,将为这一共同标记的联合工作。

代码语言:javascript
复制
export type IBookmarkItemFragment =
| ({ __typename: "Story" } & {
    story: number;
    })
| ({ __typename: "Product" } & {
    product: number;
    })
| ({ __typename: "Project" } & {
    project: number;
    });

function guardFactory<T, K extends keyof T, V extends string & T[K]>(k: K, v: V) : (o: T) => o is Extract<T, Record<K, V>> {
    return function (o: T): o is Extract<T, Record<K, V>> {
        return o[k] === v
    }
}
declare let bookmarks: IBookmarkItemFragment[]
bookmarks
.filter(guardFactory("__typename", "Project"))
.map(project => {
    return project.project;
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56276038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档