如何解决全局 node.js 对象上的此打字稿错误

How to resolve this typescript error on global node.js object

我正在按照本指南 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 的目的。

根据docs需要先声明变量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,其中包含声明。

我可以将严格模式重现为 true 和 @types/node 包版本 16

更新:在此处查看文档推荐的其他答案

这应该有效:

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;