4

我正在使用 GraphQL Codegen 从我的 GraphQL 模式生成 TypeScript 类型。这是我的查询,我使用了一个片段,因此它是唯一易于导出的类型:

query reservationsPage($schoolSettingId: Int!, $day: UnixDate!) {
  roomsForSchoolSettingAll(schoolSettingId: $schoolSettingId) {
    ...reservationsPage
  }
}

fragment reservationsPage on Room {
    id
    name
    children {
      id
      name
      registrationToday(day: $day) {
        id
        checkIn
        checkOut
        importantInformation
        plannedCheckOut
        absent
        pickUpBy {
          id
          name
        }
      }
    }
}

返回的数据如下所示:

const res = [
  {
    id: 1,
    __typename: "Room",
    name: 'Name 1',
    children: []
  },
  {
    id: 2,
    __typename: "Room",
    name: 'Name 2',
    children: [
      {
        id: 3,
        __typename: "ChildProfile",
        name: 'James',
        registration: [
          {
            id: 4,
            __typename: "Registration",
            checkIn: "06:00:00",
            checkOut: "14:00:00",
            absent: null,
            importantInformation: null,
            pickUpBy: null
            plannedCheckOut: null  
          }
        ]
      }
    ]
  }
]

我可以在新变量上使用这种类型,它可以按预期工作:

const childrenCurrent: ReservationsPageFragment['children'] = roomsForSchoolSettingAll.find(
    (room) => room.id === selectedRoomId,
  )?.children;

但是,当我尝试在另一个变量上使用它时,我得到一个 TypeScript 错误:

const childrenAll: ReservationsPageFragment['children'] = roomsForSchoolSettingAll
  .map((room) => room.children)
  .flat();

TS2322: 类型'(({ __typename?: "ChildProfile" | undefined; } & Pick<ChildProfile, "id" | "name"> & { registrationToday?: ({ __typename?: "Registration" | undefined; } & Pick< ...> & { ...; }) | null | undefined; }) | null | undefined)[]' 不可分配给类型 'Maybe<{ __typename?: "ChildProfile" | 不明确的; } & Pick<ChildProfile, "id" | "name"> & { registrationToday?: ({ __typename?: "Registration" | undefined; } & Pick<...> & { ...; }) | 空 | 不明确的; }>[]'。类型 '({ __typename?: "ChildProfile" | undefined; } & Pick<ChildProfile, "id" | "name"> & { registrationToday?: ({ __typename?: "Registration" | undefined; } & 选择<...> & { ...; }) | 空 | 不明确的; }) | 空 | undefined' 不可分配给类型 'Maybe<{ __typename?: "ChildProfile" | 不明确的; } & Pick<ChildProfile, "id" | "name"> & { registrationToday?: ({ __typename?: "Registration" | undefined; } & Pick<...> & { ...; }) | 空 | 不明确的; }>'。类型 'undefined' 不可分配给类型 'Maybe<{ __typename?: "ChildProfile" | 不明确的; } & Pick<ChildProfile, "id" | "name"> & { registrationToday?: ({ __typename?: "Registration" | undefined; } & Pick<...> & { ...; }) | 空 | 不明确的; }>'。{ __typename?: "ChildProfile" | 不明确的; } & Pick<ChildProfile, "id" | "name"> & { registrationToday?: ({ __typename?: "Registration" | undefined; } & Pick<...> & { ...; }) | 空 | 不明确的; }>'。类型 'undefined' 不可分配给类型 'Maybe<{ __typename?: "ChildProfile" | 不明确的; } & Pick<ChildProfile, "id" | "name"> & { registrationToday?: ({ __typename?: "Registration" | undefined; } & Pick<...> & { ...; }) | 空 | 不明确的; }>'。{ __typename?: "ChildProfile" | 不明确的; } & Pick<ChildProfile, "id" | "name"> & { registrationToday?: ({ __typename?: "Registration" | undefined; } & Pick<...> & { ...; }) | 空 | 不明确的; }>'。类型 'undefined' 不可分配给类型 'Maybe<{ __typename?: "ChildProfile" | 不明确的; } & Pick<ChildProfile, "id" | "name"> & { registrationToday?: ({ __typename?: "Registration" | undefined; } & Pick<...> & { ...; }) | 空 | 不明确的; }>'。}) | 空 | 不明确的; }>'。类型 'undefined' 不可分配给类型 'Maybe<{ __typename?: "ChildProfile" | 不明确的; } & Pick<ChildProfile, "id" | "name"> & { registrationToday?: ({ __typename?: "Registration" | undefined; } & Pick<...> & { ...; }) | 空 | 不明确的; }>'。}) | 空 | 不明确的; }>'。类型 'undefined' 不可分配给类型 'Maybe<{ __typename?: "ChildProfile" | 不明确的; } & Pick<ChildProfile, "id" | "name"> & { registrationToday?: ({ __typename?: "Registration" | undefined; } & Pick<...> & { ...; }) | 空 | 不明确的; }>'。

4

2 回答 2

7

如果您在错误消息文本中进行替换,它将变得更具可读性:

TS2322:
类型 '((X) | null | undefined)[]' 不可分配给类型 'Maybe<X>[]'。
键入'(X) | 空 | undefined' 不能分配给类型 'Maybe<X>'。
类型 'undefined' 不能分配给类型 'Maybe<X>'。

X 代表

{ __typename?: "ChildProfile" | 不明确的; } & Pick<ChildProfile, "id" | "name"> & { registrationToday?: ({ __typename?: "Registration" | undefined; } & Pick<...> & { ...; }) | 空 | 不明确的; }

现在我们可以看到编译器指示该类型Maybe<X>不能保存值undefined
为了满足编译器,您有多种选择

  • 过滤掉undefined
  • 使用类型转换(如 Daniele Ricci 的回答中所述)
  • 更改Maybe类型的定义以允许undefined

如果您选择修改Maybe类型,GraphQL 代码生成器文档中有一个示例:

在此处输入图像描述

于 2020-11-23T09:19:06.300 回答
2

抱歉,但是从您的问题来看,我无法理解您是在寻找错误原因的解释还是只是一种使其起作用的方法。

在第一种情况下,我不是 GraphQL 大师,因此您可以忽略我的答案,向了解 GraphQL 的人寻求答案。

在第二种情况下,您可以尝试不指定childrenAll类型:

const childrenAll = roomsForSchoolSettingAll
  .map((room) => room.children)
  .flat();

或使用类型转换:

const childrenAll: ReservationsPageFragment['children'] = roomsForSchoolSettingAll
  .map((room) => room.children)
  .flat() as unknown as ReservationsPageFragment['children'];
于 2020-11-23T08:11:36.100 回答