如何正确扩展Supabase自动生成的嵌套TypeScript接口?
解决Supabase自动生成TypeScript接口的关联查询类型扩展问题
针对你需要扩展Supabase自动生成的TypeScript接口以匹配关联查询返回结果的需求,以下是两种正确的语法实现方式:
方式一:交叉类型 + Pick工具类型
通过TypeScript的Pick工具类型提取Users表中需要的字段,再用交叉类型(&)将其与原Content类型合并,添加关联字段:
// 从自动生成的Users接口中提取需要的字段 type PartialUser = Pick<definitions["Users"], "id" | "created_at">; // 生成包含关联用户信息的Content扩展类型 type ContentWithPartialUser = definitions["Content"] & { // 字段名要和Supabase查询中指定的关联别名一致,比如查询写Users(...),默认别名是users(小写),需匹配 user: PartialUser; }; // 给Supabase查询结果指定类型 const contentList = await supabase .from("Content") .select(` *, Users(id, created_at) `) as { data: ContentWithPartialUser[] };
方式二:接口继承
如果更习惯接口写法,可通过继承原Content接口并添加关联字段实现:
interface ContentWithPartialUser extends definitions["Content"] { user: Pick<definitions["Users"], "id" | "created_at">; } // 用于查询结果类型指定 const contentList = await supabase .from("Content") .select(` *, Users(id, created_at) `) as { data: ContentWithPartialUser[] };
注意事项
- 关联字段名必须和Supabase查询中的别名一致:如果查询写的是
Users(id, created_at) as author,类型中的字段名要改成author而非user。 - 自动生成的
definitions接口无需修改,所有扩展操作都基于原类型创建新类型即可。
内容的提问来源于stack exchange,提问作者Vallo
相关产品推荐
相关产品推荐

