跳到主内容
UniKit

GraphQL 转 TypeScript

把 GraphQL SDL 生成 TypeScript 类型:支持 type / interface / input / enum / scalar / union 与 extend,按 GraphQL 语义展开可空与列表(String!、[String!]!),描述字符串生成 JSDoc,@deprecated 自动标注。

浏览器本地运行所有计算都在你的浏览器里完成,数据不会离开本机。

缩进

生成的 TypeScript

粘贴一份 GraphQL SDL 即可生成类型

这个工具能做什么

  • 后端只提供了 GraphQL schema,前端要写类型安全的查询结果:直接生成 interface,省掉手抄字段的工夫。
  • 给代码生成器 / mock 服务准备 TypeScript 类型,把 schema 当唯一事实来源,字段改名时编译期就能发现。
  • 接手别人的 schema 时快速摸清结构:有多少 object、多少 enum、多少 input,以及哪些字段是可空的。
  • 写 resolver 或 data loader 时需要准确的返回类型:把 `String!`、`[Post!]!` 这类标记原样展开成 `string`、`Post[]`。

示例

输入

type User implements Node {
  id: ID!
  """Display name"""
  name: String!
  nickname: String
  posts(limit: Int = 10): [Post!]!
  role: Role!
}

interface Node {
  id: ID!
}

type Post {
  id: ID!
  title: String!
  author: User!
}

enum Role {
  ADMIN
  MEMBER
}

input CreateUserInput {
  name: String!
  role: Role = MEMBER
}

scalar DateTime

union SearchResult = User | Post

输出

export interface User extends Node {
  id: string;
  /** Display name */
  name: string;
  nickname: string | null;
  posts: Post[];
  role: Role;
}

export interface Node {
  id: string;
}

export interface Post {
  id: string;
  title: string;
  author: User;
}

export type Role = "ADMIN" | "MEMBER";

export interface CreateUserInput {
  name: string;
  role: Role | null;
}

export type DateTime = unknown;

export type SearchResult = User | Post;

可空与列表按 GraphQL 语义展开:`String` → `string | null`、`[String!]!` → `string[]`、`[String]` → `(string | null)[] | null`;描述字符串会变成 JSDoc。

常见问题

用的是官方 graphql 库吗?

不是。为了不引入额外依赖,这里自带一套 SDL 词法分析与递归下降解析器,只实现类型定义部分:type、interface、input、enum、scalar、union、extend,以及字段类型、参数、指令和描述字符串。

字段参数会生成什么?

参数不参与 TS 类型生成(它们属于查询而不是数据结构),解析时会跳过;带默认值的参数(如 `posts(limit: Int = 10)`)同样会被正确跳过,不会影响后面的字段。

自定义 scalar 怎么处理?

schema 里声明过的 scalar 会生成 `export type DateTime = unknown;` 这样的别名,字段里引用它;如果引用了未声明的类型,会降级成 `unknown` 并在结果里给出提示,而不是生成一个编译不过的名字。

interface 与 implements 会生成 extends 吗?

会。`type A implements B` 生成 `export interface A extends B { ... }`。因为 GraphQL 要求实现类型重新声明接口字段,这里也会把字段原样输出,生成的 TS 与 GraphQL 的类型检查规则一致。

输入的内容会被上传吗?

不会。解析与生成全部在浏览器里用 JavaScript 完成,页面不发起任何网络请求,断网也能用,schema 内容不会被记录。

关键词:graphqlgraphql 转 typescriptgraphql to tssdlschema 转类型typescript 类型codegengraphql 类型生成接口类型gql

同类工具