Kysely ColumnType插入类型编译错误排查
Kysely Insertable 类型报错:number 无法赋值给 Int8(Generated 包裹 ColumnType 导致)
问题核心是Generated
你定义的 Int8 是 ColumnType<string, bigint | number | string, ...>,它的读取类型是 string,插入/更新类型是 bigint | number | string。但当用 Generated<Int8> 包裹后,Insertable<UserTable> 会把 phoneOneCountryId 的类型直接解析为 Int8(也就是读取时的 string 类型),而不是自动提取 ColumnType 里的插入类型。这就导致你赋值 number 时,出现类型不兼容的错误。
解决办法有两种:
1. 手动覆盖字段类型
定义 NewUser 时,直接覆盖该字段的插入类型:
// 先定义工具类型提取 ColumnType 的插入类型 type GetInsertType<T> = T extends ColumnType<any, infer InsertType, any> ? InsertType : T; export type NewUser = Omit<Insertable<UserTable>, 'phoneOneCountryId'> & { // 可选,因为有默认值;如果要传值,允许 bigint/number/string phoneOneCountryId?: GetInsertType<Int8>; };
2. 调整 Generated 的泛型参数(如果可以修改生成的代码)
如果能手动修改 codegen 生成的 UserTable,可以把 Generated<Int8> 改成直接使用插入类型,这样 Insertable 就能正确识别:
export interface UserTable { // ... phoneOneCountryId: Generated<bigint | number | string>; // ... }
另外也可以检查下 Kysely 版本,部分旧版本对 Generated<ColumnType> 的类型处理有缺陷,升级到最新稳定版可能也能解决问题。
内容的提问来源于stack exchange,提问作者IfTrue
相关产品推荐
相关产品推荐

