在我的package.json文件中,我有运行的脚本条目,graphql-codegen但它抱怨--config参数无效:
$> yarn gen
yarn run v1.21.1
$ graphql-codegen --config codegen.yml
Error: Unknown argument: config
...
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
Run Code Online (Sandbox Code Playgroud)
由于我相信默认文件名codegen.yml无论如何,我尝试在没有该参数的情况下运行它并且没有生成任何内容:
$> yarn graphql-codegen
yarn run v1.21.1
$ /home/aaron/projects/my_app/node_modules/.bin/graphql-codegen
Done in 0.17s.
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我正在使用 apollo-server-lambda、Prisma ORM 和 graphql-codegen。
我有getBookById一个返回Book. Book包含一个名为 的枚举BookStatus。我希望能够在操场上以 ENUM 形式返回,但出现错误:
无法为不可为 null 的字段 Book.bookStatus 返回 null。
图书状态 - TypeDef
enum BookStatus {
OPEN
DRAFT
CLOSED
}
Run Code Online (Sandbox Code Playgroud)
书籍 - TypeDef
type Book {
id: ID!
title: String!
bookStatus: BookStatus!
}
Run Code Online (Sandbox Code Playgroud)
getBookById - TypeDef
type Query {
getBookById(getBookByIdInput: GetBookByIdInput): Book
}
Run Code Online (Sandbox Code Playgroud)
我正在使用 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
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
返回的数据如下所示:
const res = [
{
id: 1,
__typename: "Room",
name: 'Name 1',
children: []
},
{
id: 2,
__typename: "Room",
name: 'Name 2',
children: [
{
id: 3,
__typename: "ChildProfile",
name: …Run Code Online (Sandbox Code Playgroud) GraphQL 代码生成器在创建的 TypeScript 文件顶部创建此类型:
export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };
Run Code Online (Sandbox Code Playgroud)
并将其用于所有客户端创建的查询变量:
src/foo.graphql:
query Foo($id: ID!) {
foo(id: $id) {
bar
}
}
Run Code Online (Sandbox Code Playgroud)
generated/foo.ts:
...
export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };
...
export type FooQueryVariables = Exact<{
id: Scalars['ID'];
}>;
...
Run Code Online (Sandbox Code Playgroud)
这种类型的目的是什么Exact<T>?它有何影响FooQueryVariables(相对于如果不存在的话)?
https://www.graphql-code-generator.com/#live-demo的完整演示:
schema.graphql:
schema {
query: Query
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试将工具生成的类型分配给属性graphql-codegen。我尝试分配的类型是嵌套类型。给定以下类型:
type SomeType = {
someKey: Maybe<
{ __typename?: "OtherType" | undefined } &
{ someNestedKey: ({ __typename?: "AnotherType" | undefined } & Pick<AnotherType, "prop1" | "prop2">)[] }
>
}
Run Code Online (Sandbox Code Playgroud)
我需要能够做到:
myProperty: SomeType['someKey']['someNestedKey'] = []
Run Code Online (Sandbox Code Playgroud)
然而,我遇到的问题是 的类型someKey是一种Maybe类型,因此 Typescript 抱怨该类型没有someNestedKey属性<Maybe { __typename?: "OtherType" | ...} & { someNestedKey: (...)[] }>(即 的类型someKey)。
在 Typescript 中,您可以使用该!方法来声明您确定知道与undefinedand/or联合的类型的属性值null实际上在这种情况下存在。在分配类型时有没有办法做类似的事情?
由于我使用该graphql-codegen工具,因此我无法控制这些类型。
我使用 graphql-codegen 生成类型文件。
举个例子,假设我的schema.graphql文件中有以下内容:
enum cities {
JOHANNESBURG
CAIRO
NEW_YORK
LONDON
BEIJING
}
Run Code Online (Sandbox Code Playgroud)
我的文件中的输出generated-types.ts如下:
export enum cities {
Johannesburg = 'JOHANNESBURG'
Cairo = 'CAIRO'
NewYork = 'NEW_YORK'
London = 'LONDON'
Beijing = 'BEIJING'
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让我在 codegen 运行之前“覆盖”枚举的值?也许如下(我显然尝试过):
enum cities {
JOHANNESBURG: 'JNB'
CAIRO: 'CAI'
NEW_YORK: 'NYC'
LONDON: 'LON'
BEIJING: 'BEI'
}
Run Code Online (Sandbox Code Playgroud)
这又应该产生:
export enum cities {
Johannesburg = 'JNB'
Cairo = 'CAI'
NewYork = 'NYC'
London = 'LON'
Beijing = 'BEI'
}
Run Code Online (Sandbox Code Playgroud) 我目前正在尝试解决以下问题,但还没有走得太远。目前,我正在运行 Apollo-Server 作为我的 graphQL 服务器,为 prisma2 配置了 postgres 数据库,并利用 graphql-codegen 从我的模式生成类型。目前,我正在尝试更新具有多对多关系的模型,并抛出非常奇怪的打字稿错误。我很确定我的更新不正确,但我看到的错误没有帮助。
以下是相关代码片段:
棱镜模式
model Permission {
id Int @id @default(autoincrement())
verb PermissionVerb
resource PermissionModel
own Boolean @default(true)
roles Role[]
}
model Role {
id Int @id @default(autoincrement())
name String
permissions Permission[]
}
enum PermissionModel {
USER
ORDER
CUSTOMER
PERMISSION
ROLE
}
enum PermissionVerb {
CREATE
READ
UPDATE
DELETE
}
Run Code Online (Sandbox Code Playgroud)
权限.gql
extend type Mutation {
updatePermission(input: UpdatePermissionInput): PermissionResult!
}
union PermissionResult = Permission | PermRoleNotFoundError
type Permission {
id: Int!
own: …Run Code Online (Sandbox Code Playgroud) 我的 GraphQL 模式中有一个自定义标量,我希望我的 Codegen 为我生成正确的类型。
我的架构如下所示:
scalar Decimal
type Item {
price: Decimal!
}
Run Code Online (Sandbox Code Playgroud)
我为此标量添加了一个使用 [Decimal.js][1] 的自定义解析器。
当我从此架构生成 Typescript 类型时,我希望它能够识别price为 Decimal 类型并具有 Decimal.js 提供的属性。
我的代码生成配置如下所示:
schema: "./src/typeDefs/index.ts"
generates:
./src/types.d.ts:
config:
scalars:
Decimal: Decimal
plugins:
- typescript
- typescript-resolvers
Run Code Online (Sandbox Code Playgroud)
虽然这会生成Decimal类型,但它不会将其识别为 Decimal.js 的类型,因此它没有库公开的任何方法。
它生成以下类型:
export type Scalars = {
ID: string;
String: string;
Boolean: boolean;
Int: number;
Float: number;
Decimal: Decimal; // doesn't have any Decimal.js props
};
Run Code Online (Sandbox Code Playgroud)
如何告诉 codegen 使用 Decimal.js 生成正确的 Decimal 类型?[1]: https: //www.npmjs.com/package/decimal.js