You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Supabase+TypeScript中upsert等函数报ts(2344)类型错误如何解决?

解决Supabase + TypeScript中insert/update/upsert的类型错误问题

问题根源

你遇到的Type <Restaurant> does not satisfy the constraint 'never'和参数类型不匹配错误,本质是Supabase客户端没有正确关联restaurants表的类型元数据,导致from('restaurants')返回的PostgrestQueryBuilder默认是PostgrestQueryBuilder<never, never>,所有CRUD方法的类型约束完全失效。

解决方案

1. 用Supabase CLI自动生成数据库类型定义

这是官方推荐的最优方案,能保证TypeScript类型和数据库结构完全同步:

  • 安装Supabase CLI:
    npm install -g supabase
    
  • 登录你的Supabase账号:
    supabase login
    
  • 在项目根目录生成类型文件(替换<你的项目ID>,可在Supabase控制台「设置->API」页面找到):
    supabase gen types typescript --project-id <你的项目ID> --schema public > types/supabase.ts
    

2. 初始化Supabase客户端时绑定类型

修改客户端初始化代码,导入生成的Database类型并指定给createClient:

import { createClient } from '@supabase/supabase-js';
import { Database } from './types/supabase'; // 路径根据实际生成位置调整

export const supabaseClient = createClient<Database>(
  import.meta.env.VITE_SUPABASE_URL,
  import.meta.env.VITE_SUPABASE_ANON_KEY
);

3. 调整业务代码,自动推断类型

现在from('restaurants')会自动识别表的结构,无需手动指定泛型参数,代码可简化为:

const addRestaurant = async () => {
  if (!user.value) return 
  
  const { data, error } = await supabaseClient
    .from('restaurants')
    .upsert({
      id: user.value.id,
      name: name.value,
      categories: arr,
      open: status.value,
      description: description.value
    })
    .select()
  console.log(data, error);
}

如果需要显式引用表类型,可直接从生成的Database中导出:

import { Database } from './types/supabase';

// 表的行类型
type Restaurant = Database['public']['Tables']['restaurants']['Row'];
// 表的插入类型(自动忽略自增字段等)
type RestaurantInsert = Database['public']['Tables']['restaurants']['Insert'];

为什么手动定义类型无效?

Supabase的PostgrestQueryBuilder泛型约束依赖于客户端绑定的Database类型结构,手动编写的Restaurant类型无法和客户端内部的类型系统对齐,因此会触发never类型约束错误。

内容的提问来源于stack exchange,提问作者Antonio Ivanov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 00:10:45