关于 prisma-json-types-generator
这是一项为 Prisma 字段指定 TypeScript 类型的编码技能,通过 schema 注释实现。它指导字段与命名空间声明的修改、类型生成和检查,也涵盖 TypedSQL 注解。
主要功能
- 01为 Json、String、String[]、Int 和 Float 字段设类型
- 02使用命名空间或内联 TypeScript 类型
- 03通过三斜线注释标注字段
- 04为 TypedSQL 结果和参数设类型
- 05提供配置与故障排查指导
适用场景
- 01为 Prisma JSON 字段添加 TypeScript 类型
- 02在多个 schema 字段间复用命名类型
- 03标注 TypedSQL 列和参数
- 04排查生成类型未生效的原因
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ arthurfiorette/ prisma-json-types-generator --skill prisma-json-types-generator安装后在 Claude Code 中输入/prisma-json-types-generator确认已加载。
附带文件references/setup.md
详细介绍
prisma-json-types-generator
此生成器会将 Prisma 的 Json、String、String[]、Int 和 Float 字段设为取自 schema 注释的 TypeScript 类型。它只会重写 prisma generate 生成的类型。运行时和数据库都不会进行任何检查。
工作流
- 阅读相关的 Prisma schema;如果存在,还要阅读声明
PrismaJson命名空间的文件。只有在未拾取命名空间声明时,才阅读tsconfig.json。 - 如果尚未安装此生成器,或其配置看起来有问题,请先阅读
references/setup.md,再编辑字段。 - 为字段选择命名空间类型或内联类型。
- 在字段正上方添加或修正
///注释。 - 如果使用命名空间类型,请添加或更新其声明。
- 尽可能运行
prisma generate(如果项目使用 TypedSQL,则运行prisma generate --sql)以及项目的类型检查。
只修改用户要求处理的字段。
命名空间类型或内联类型
/// [TypeName] 会在配置的命名空间中引用 TypeName,默认命名空间为 PrismaJson。此方式适用于对象、多个字段共享的类型,以及之后可能需要 Zod schema 的类型。
/// ![Type] 使用写在 schema 中的 TypeScript 类型表达式。此方式适用于简短的字面量联合类型和小型的一次性对象。
model Post {
/// [PostMeta]
meta Json
/// !['draft' | 'published' | 'archived']
status String
/// ![1 | 2 | 3]
rank Int
/// ![{ width: number; height: number }]
dimensions Json
}
命名空间声明文件必须是 tsconfig.json 包含的模块。类型本身可以定义在任意位置,再通过别名纳入命名空间:
import type { PostMeta as DomainPostMeta } from './domain/post-meta';
declare global {
namespace PrismaJson {
type PostMeta = DomainPostMeta;
}
}
不含任何导入语句的声明文件需要添加 export {};,才能保持为模块。
字段规则
- 注释使用
///。Prisma 不会将普通的//注释纳入生成器读取的 DMMF。 - 注释必须紧挨在对应字段的上方。
- Prisma 会保留可空性和列表包装,因此类型描述的是单个元素。使用
tags Json[]并添加/// [Tag]。/// ![Tag[]]这样的数组类型应放在普通的Json字段上,该字段存储的是 JSON 数组。 - 可空字段(
Json?、String?、Int?、Float?)和String[]使用相同的注释。 - MongoDB 复合
type块中的字段也可以像模型字段一样设置类型。 - 未设置类型的
Json字段会解析为unknown,除非生成器设置了allowAny或useType。
TypedSQL
使用 prisma generate --sql 时,生成器还会为 TypedSQL 的结果和参数设置类型,适用于 prisma-client 和 prisma-client-js。
在 PostgreSQL 上,直接从表列读取的结果列会获得对应 schema 字段的类型,此规则适用于别名、联接、子查询和 CTE。匹配时,生成器会向数据库查询每列的来源,不会比较名称。此功能需要 pg 包和 DATABASE_URL 中的连接 URL,或者需要在 typedSqlUrlEnv 选项指定的变量中提供连接 URL。若未提供,生成器会发出警告,并且只应用 .sql 注释。
计算列以及其他数据库中的所有列,都需要在 .sql 文件中使用 -- 注释来指定类型:沿用常规语法,并在后面加上返回列的名称。这些注释会覆盖 schema 字段类型。参数类型需写在其 @param 描述的开头。
-- [UserStats] stats
-- ![{ total: number }] "Total Count"
-- @param {Json} $1:filter [PostFilter]
SELECT
json_build_object('posts', count(*)) AS stats,
json_build_object('total', count(*)) AS "Total Count"
FROM "Post"
WHERE meta @> $1
PostgreSQL 会将未加引号的列名转换为小写(AS Stats 会返回 stats),注释必须使用返回的名称。如果查询不在 schema 同级的 sql/ 目录中,请设置 typedSqlPath 选项。
故障排查
如果某个字段仍显示为 JsonValue、unknown 或普通标量,请按以下顺序检查:
- 是否存在包含
provider = "prisma-json-types-generator"的生成器块。 - 注释是否以
///开头,并且紧挨着字段上方。 namespace选项是否与 TypeScript 中声明的命名空间一致。- 声明文件是否为模块,且
tsconfig.json是否包含该文件。 - 架构变更后是否运行了
prisma generate。生成器的错误和警告会在命令仍以成功状态退出时输出,因此请阅读其输出。 - 对于 TypedSQL,是否传入了
--sql、是否安装了pg、是否设置了 URL 变量,以及注释名称是否与返回的列名一致。
JsonFilter 和 JsonWithAggregatesFilter 按设计保持非类型化。请勿尝试为筛选输入指定类型。
收尾
- 工作区可用时,直接编辑文件,而不只是提出修改建议。
- 将差异限制在涉及的架构文件和类型声明文件中。
- 报告更改内容和运行过的验证命令;如果无法运行,请说明。