typescript - 如何从类型声明中的嵌套数组中提取类型?

标签 typescript

我有一个生成的类型,如下所示:

export type GetUserWithMembershipsQuery = {
  getUser: {
    __typename: 'User';
    id: string;
    memberships: {
      __typename: 'ModelUserMembershipConnection';
      items: Array<{
        __typename: 'UserMembership';
        id: string;
        createdOnDate: string | null;
        renewedOnDate: string | null;
        expiresOnDate: string | null;
        membershipPhotoFileName: string | null;
      } | null> | null;
    } | null;
  } | null;
};

我知道我可以通过 GetUserWithMembershipQuery['getUser'] 获取 getUser 的类型。

我想知道如何从该类型中提取成员(member)对象中的项目数组的类型,或者是否可能?

我希望得到类似的结果:

type ItemType = GetUserWithMembershipQuery['getUser']['memberships']['items'][0]

结果类型是:

{
  __typename: 'UserMembership';
  id: string;
  createdOnDate: string | null;
  renewedOnDate: string | null;
  expiresOnDate: string | null;
  membershipPhotoFileName: string | null;
} | null

我尝试使用 GetUserWithMembershipQuery['getUser']['memberships'] 进一步降低一级,但收到一条错误消息,指出“类型 .. 上不存在属性成员身份”。 .'

这是因为 getUsermemberships 可能为 null 吗?有什么办法可以提取这种类型吗?任何有关我如何更好地理解这一点的资源的帮助都会有很大的帮助。

谢谢。

最佳答案

问题是,在 strictNullChecks 下,如果类型位于具有 null 的联合中,则无法访问任何成员。值和类型表达式都是这种情况。您仍然可以获得该类型,但需要使用 Exclude 条件类型从联合中排除 null。语法变得有点过于复杂,无法仅用一行编写,因此我将其分解为几个步骤:

type getUser = Exclude<GetUserWithMembershipsQuery['getUser'], null>
type memberships = Exclude<getUser['memberships'], null>
type items = Exclude<memberships['items'], null>
type item =  Exclude<items[number], null>

关于typescript - 如何从类型声明中的嵌套数组中提取类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53137005/

相关文章:

typescript - 找不到我的 Typescript 库的声明文件,即使它存在

angular - 在 karma 旁边使用 Jest 冲突类型,Angular 上的 Jasmine

typescript - 如何让函数传递具有相同重载的参数?

typescript - ng2-bootstrap 分页和 bootstrap 表集成错误

javascript - 如何让 webpack 包含为 Typescript Nodejs(而非浏览器)项目生成的声明文件(以及如何使用)

reactjs - 如何创建绑定(bind)故事书控件参数的通用 typescript 函数

javascript - 将 Angular 8 开发工具更新到 15 开发工具后,调试器无法在浏览器开发工具上运行

node.js - 如何允许 Mongoose 模式中的枚举字段为空?

javascript - 如果我没有填写 Angular 响应式(Reactive)表单中的所有详细信息,表单会出现错误

javascript - 错误 TS2349 : Cannot invoke an expression whose type lacks a call signature. 类型 '{ ; }' 没有兼容的调用签名