@graphql-codegen 创建的 `Exact<T>` 类型的目的是什么?
What is the purpose of the `Exact<T>` type that @graphql-codegen creates?
GraphQL Code Generator 在创建的 TypeScript 文件的顶部创建此类型:
export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };
并将其用于所有客户端创建的查询变量:
src/foo.graphql
:
query Foo($id: ID!) {
foo(id: $id) {
bar
}
}
generated/foo.ts
:
...
export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };
...
export type FooQueryVariables = Exact<{
id: Scalars['ID'];
}>;
...
这种 Exact<T>
类型的目的是什么?它如何影响 FooQueryVariables
(相对于如果它不存在)?
https://www.graphql-code-generator.com/#live-demo的完整演示:
schema.graphql
:
schema {
query: Query
}
type Query {
foo(id: ID!): Foo
}
type Foo {
bar: String!
}
operation.graphql
:
query Foo($id: ID!) {
foo(id: $id) {
bar
}
}
codegen.yml
:
generates:
operations-types.ts:
plugins:
- typescript
- typescript-operations
生成operations-types.ts
:
export type Maybe<T> = T | null;
export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };
export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };
export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };
/** All built-in and custom scalars, mapped to their actual values */
export type Scalars = {
ID: string;
String: string;
Boolean: boolean;
Int: number;
Float: number;
};
export type Query = {
__typename?: 'Query';
foo?: Maybe<Foo>;
};
export type QueryFooArgs = {
id: Scalars['ID'];
};
export type Foo = {
__typename?: 'Foo';
bar: Scalars['String'];
};
export type FooQueryVariables = Exact<{
id: Scalars['ID'];
}>;
export type FooQuery = { __typename?: 'Query', foo?: Maybe<{ __typename?: 'Foo', bar: string }> };
它旨在使人们无法将具有任何附加属性(除 id
之外)的对象传递为 FooQueryVariables
。但它没有这样做:https://github.com/dotansimha/graphql-code-generator/issues/4577
GraphQL Code Generator 在创建的 TypeScript 文件的顶部创建此类型:
export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };
并将其用于所有客户端创建的查询变量:
src/foo.graphql
:
query Foo($id: ID!) {
foo(id: $id) {
bar
}
}
generated/foo.ts
:
...
export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };
...
export type FooQueryVariables = Exact<{
id: Scalars['ID'];
}>;
...
这种 Exact<T>
类型的目的是什么?它如何影响 FooQueryVariables
(相对于如果它不存在)?
https://www.graphql-code-generator.com/#live-demo的完整演示:
schema.graphql
:
schema {
query: Query
}
type Query {
foo(id: ID!): Foo
}
type Foo {
bar: String!
}
operation.graphql
:
query Foo($id: ID!) {
foo(id: $id) {
bar
}
}
codegen.yml
:
generates:
operations-types.ts:
plugins:
- typescript
- typescript-operations
生成operations-types.ts
:
export type Maybe<T> = T | null;
export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };
export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };
export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };
/** All built-in and custom scalars, mapped to their actual values */
export type Scalars = {
ID: string;
String: string;
Boolean: boolean;
Int: number;
Float: number;
};
export type Query = {
__typename?: 'Query';
foo?: Maybe<Foo>;
};
export type QueryFooArgs = {
id: Scalars['ID'];
};
export type Foo = {
__typename?: 'Foo';
bar: Scalars['String'];
};
export type FooQueryVariables = Exact<{
id: Scalars['ID'];
}>;
export type FooQuery = { __typename?: 'Query', foo?: Maybe<{ __typename?: 'Foo', bar: string }> };
它旨在使人们无法将具有任何附加属性(除 id
之外)的对象传递为 FooQueryVariables
。但它没有这样做:https://github.com/dotansimha/graphql-code-generator/issues/4577