JS转TS时Objection.js的transaction、query方法报不存在错误
问题根因
TS无法识别transaction、query方法的核心原因有两点:
- 依赖安装错误:你当前安装的
@types/knex@0.16.1版本过旧,且Objection.js v2及以上版本已经内置完整TS类型,不需要额外安装第三方@types/objection包,错误的类型包会导致类型覆盖、识别失效。 - 模型定义错误:你的
User类没有正确继承Objection.js提供的Model基类,自然无法获得基类上挂载的静态方法类型。
修复步骤
- 清理错误依赖,安装兼容版本
首先卸载过旧的knex类型包,Knex从0.21版本开始已经内置TS类型,无需单独安装社区类型包:
安装/更新到兼容版本的Objection和Knex,注意不要额外安装npm uninstall @types/knex@types/objection:npm install objection@^3 knex@^2 - 修正User模型定义
确保User类直接继承Objection导出的Model基类,同时绑定你初始化好的knex实例,参考写法:import { Model } from 'objection'; import knexInstance from '@/config/knex'; // 你项目里初始化knex的文件 // 给所有Objection模型绑定knex连接 Model.knex(knexInstance); export default class User extends Model { static tableName = 'users'; // 补全你原有自定义方法的类型 canActAs(userId: string | number): boolean { // 原有业务逻辑 } isAdmin(): boolean { // 原有业务逻辑 } filtered(): Omit<User, 'password' | 'sensitiveField'> { // 原有字段过滤逻辑 } } - 调整tsconfig.json配置
确保以下配置项正确,避免类型解析异常:{ "compilerOptions": { "target": "ES2020", "moduleResolution": "Node", "esModuleInterop": true, "skipLibCheck": true, "strict": true }, "include": ["src/**/*"] }
校验结果
完成以上操作后,你原来代码里的User.transaction()、User.query(trx)就可以被TS正确识别类型,不会再抛出ts(2339)错误。如果还有类型报错,先检查全局node_modules里有没有残留旧版@types/objection包,清理后重新安装依赖即可。
内容的提问来源于stack exchange,提问作者sizzle
相关产品推荐
相关产品推荐

