【发布时间】:2021-11-14 23:39:57
【问题描述】:
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 }> };
【问题讨论】:
-
它完全“扩展”了类型(在代码编辑器中提供了更好的提示)。考虑
type A = { a: number; }; type B = { b: string; }; type C = A & B;...如果您将鼠标悬停在C上,您将在智能感知中看到A & B。如果将CE悬停在type CE = Exact<C>中,您将看到{ a: number; b: string; }。至于为什么会发生这种情况,我会把它留给其他人。见typescriptlang.org/play?#code/…
标签: typescript graphql graphql-codegen