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

时间:2018-11-04 01:29:20

标签: 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的类型。

我想知道如何从该类型的成员资格对象中提取items数组的类型,或者是否有可能?

我想以这样的结尾:

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可能为空吗?有没有办法我可以提取这种类型?指向资源的任何帮助,如果我能更好地理解这一点,将是很大的帮助。

谢谢。

1 个答案:

答案 0 :(得分:2)

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

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