如何解决全局 node.js 对象的 TypeScript 错误

4

我正在按照这个指南https://vercel.com/guides/nextjs-prisma-postgres创建一个全栈应用程序。在这段代码中,Typescript会抛出一个错误:

import { PrismaClient } from '@prisma/client';
let prisma: PrismaClient;

if (process.env.NODE_ENV === 'production') {
  prisma = new PrismaClient();
} else {
  if (!global.prisma) {
    global.prisma = new PrismaClient();
  }
  prisma = global.prisma;
}

export default prisma;

TypeScript在global.prisma上抛出了一个ts7017错误:

Element implicitly has an 'any' type because type 'typeof globalThis' has no index signature.

有人能帮我理解这个问题并告诉我如何修复吗?目前我在tsconfig中将“strict”设置为false,这暂时解决了问题,但我相信关闭它会失去TS的作用。


你知道global.prisma是如何声明的吗? 如果你无法获取它的声明,你是否尝试过使用global.prisma as PrismaClient进行强制转换? - Pablo
我只是不会使用全局变量.. 甚至不清楚他们一开始为什么要这样做.. 真奇怪!!! 他们甚至后来才导入。import prisma from '../lib/prisma'; - Keith
1
Prisma团队的Nikolas在这里!我们建议以这种方式实例化PrismaClient,否则由于Next.js的热重载,在开发中会耗尽DB连接限制。这是我们关于此问题的文档页面:https://www.prisma.io/docs/support/help-articles/nextjs-prisma-client-dev-practices 我正在与我们的一些TypeScript工程师核对,看看如何解决这个问题。 - nburk
2个回答

16

我可以通过将strict模式设置为true,以及使用版本号为16的@types/node包来重现相同的错误。

更新:请参见文档中建议的其他答案https://dev59.com/6msMtIcB2Jgan1znv3Jr#69851359

下面的代码应该可以正常工作:

declare global {
  var prisma: PrismaClient; // This must be a `var` and not a `let / const`
}

import { PrismaClient } from "@prisma/client";
let prisma: PrismaClient;

if (process.env.NODE_ENV === "production") {
  prisma = new PrismaClient();
} else {
  if (!global.prisma) {
    global.prisma = new PrismaClient();
  }
  prisma = global.prisma;
}

export default prisma;

4
根据文档,首先需要声明变量global
import { PrismaClient } from '@prisma/client'

declare global {
  var prisma: PrismaClient | undefined
}

export const prisma =
  global.prisma ||
  new PrismaClient({
    log: ['query'],
  });

if (process.env.NODE_ENV !== 'production') global.prisma = prisma;

你也可以使用一个独立的文件globals.d.ts来声明。


你能再解释一下写 | undefined 的目的吗? - Alejandro Zapien
在这种情况下,管道被用来分离变量prisma可能的不同类型。通过添加“| undefined”,typescript会在变量在没有检查是否定义的情况下使用时发出警告。 - SebasWebDev
感谢您的澄清和帮助我理解 :) - Alejandro Zapien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接