从 TypeScript 类型定义或 GraphQL 片段定义生成 JavaScript 空对象

Posted

技术标签:

【中文标题】从 TypeScript 类型定义或 GraphQL 片段定义生成 JavaScript 空对象【英文标题】:Generate JavaScript empty object from TypeScript type definition, or GraphQL fragment definition 【发布时间】:2020-11-26 06:30:27 【问题描述】:

我在一个带有 Apollo 客户端的项目中使用 GraphQL,当我使用 writeFragment 时,我必须将对象形状与片段定义相匹配。我现在正在手动执行此操作,但这会导致大量不必要的代码,并且在片段定义更改时会使事情变得脆弱。

我想从gql 片段生成一个空的javascript 对象。例如

export const instructorFragment = gql`
  fragment InstructorDetails on InstructorProfile 
    id
    user_id
    picture_url
    title
    bio

    tags 
      ...TagDetails
    
  
  $tagFragment
`;

export const tagFragment = gql`
  fragment TagDetails on Tag 
    id
    label
  
`;

应该生成类似的东西:


    id: null,
    user_id: null,
    picture_url: null,
    title: null,
    bio: null,
    tags: 
        id: null,
        label: null
    

片段对象有足够的信息来执行此操作,但尽管谷歌搜索了很多,但我还是找不到库。

选项 1 是使用已经存在的东西 选项 2 是编写我自己的函数 选项 3 是:

我正在使用GraphQL Code Generator 从我的代码中生成 TypeScript 定义,所以我有这样的代码:

export type InstructorProfile = 
  __typename?: 'InstructorProfile';
  id: Scalars['ID'];
  user_id?: Maybe<Scalars['ID']>;
  picture_url?: Maybe<Scalars['String']>;
  title?: Maybe<Scalars['String']>;
  bio?: Maybe<Scalars['String']>;
  tags?: Maybe<Array<Maybe<Tag>>>;
;

export type Tag = 
  __typename?: 'Tag';
  id: Scalars['ID'];
  label: Scalars['String'];
;

有没有办法把它变成我想要的?

【问题讨论】:

您可以从值创建类型。你不能从类型中创建值。 我不确定我是否完全理解您在做什么,但是,TypeScript 是编译时的事情,当您尝试运行代码时,它就是 JavaScript。正如我们已经知道的那样,JavaScript 没有类型的概念。因此,运行代码并基于TypeScript 类型生成一些东西的想法实际上行不通。 【参考方案1】:

上面列出的生成类型定义的工具,在它的网站上说如下。

GraphQL Codegen 的目标之一是允许您轻松自定义输出,并根据您的需要添加自定义行为。

所以应该可以编写一个自定义插件来做你想做的事,这里是插件开发入门的链接。

https://graphql-code-generator.com/docs/custom-codegen/write-your-plugin

【讨论】:

以上是关于从 TypeScript 类型定义或 GraphQL 片段定义生成 JavaScript 空对象的主要内容,如果未能解决你的问题,请参考以下文章

为没有或许多不同参数类型的函数定义 Typescript 类型

如何从 TypeScript 文件生成类型定义文件?

TypeScript:从字符串数组定义联合类型

如何从 Typescript 中的常量定义字符串文字联合类型

从0开始的TypeScriptの十:泛型

从0开始的TypeScriptの十:泛型