@graphql-codegen 创建的 `Exact<T>` 类型的目的是啥?
Posted
技术标签:
【中文标题】@graphql-codegen 创建的 `Exact<T>` 类型的目的是啥?【英文标题】:What is the purpose of the `Exact<T>` type that @graphql-codegen creates?@graphql-codegen 创建的 `Exact<T>` 类型的目的是什么? 【发布时间】: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/…
【参考方案1】:
它的目的是使它不能将具有任何附加属性的对象(除了id
)作为FooQueryVariables
传递。但它没有这样做:https://github.com/dotansimha/graphql-code-generator/issues/4577
【讨论】:
以上是关于@graphql-codegen 创建的 `Exact<T>` 类型的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章
从 graphql-codegen 获取类似于 apollo codegen 生成的类型
typescript 和 graphql-codegen 之间的枚举不匹配
Apollo Server:Eject 内置“上传”类型以使用 graphql-codegen 生成 TS 类型
如何在 typescript/javascript 导出中使用字符串模板来处理 graphql-codegen 架构
在客户端解析器中导入类型时,如何避免使用 Apollo 客户端和“graphql-codegen”的角度项目中的循环依赖?