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