如何解决Node.js全局对象使用Prisma触发的TypeScript TS7017报错
报错产生原因
TypeScript默认没有在globalThis(也就是代码中用到的global对象)的类型定义里添加prisma属性,开启strict模式时,TS不允许访问未声明类型的对象属性,所以会抛出TS7017隐式any类型错误。直接关闭strict会丢失大量类型校验能力,确实不推荐。
正确修复方法
步骤1:添加全局类型声明
在项目根目录下新建prisma.d.ts类型声明文件,写入以下内容:
import { PrismaClient } from '@prisma/client' declare global { // 注意必须用var声明,才能正确挂载到globalThis类型上 var prisma: PrismaClient | undefined }
如果项目有专门的@types文件夹,也可以把这个声明文件放在@types目录下,只要确保tsconfig.json的include配置能覆盖到这个文件即可。
步骤2:优化原有代码逻辑
添加完类型声明后,原来的代码就不会再触发类型错误了,还可以把原有代码简化为官方推荐的写法:
import { PrismaClient } from '@prisma/client'; const prisma = global.prisma ?? new PrismaClient(); if (process.env.NODE_ENV !== 'production') { global.prisma = prisma; } export default prisma;
这种写法可以避免开发环境热重载时反复创建PrismaClient实例,导致数据库连接数被耗尽的问题。
内容的提问来源于stack exchange,提问作者Alejandro Zapien
相关产品推荐
相关产品推荐

