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

Ale*_*ien 6 postgresql node.js typescript next.js prisma

我按照本指南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;

Run Code Online (Sandbox Code Playgroud)

TypeScript 正在抛出ts7017一个global.prisma:

Element implicitly has an 'any' type because type 'typeof globalThis' has no index signature.
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我理解这个问题以及如何解决吗?同时,我在 tsconfig 中将“strict”设置为 false,从而暂时抑制了该问题,尽管我确信关闭它会破坏 TS 的目的。

Joë*_*oël 19

我可以使用严格模式为 true 并@types/node打包版本 16来重现相同的错误

更新:请参阅此处文档推荐的其他答案/sf/answers/4889595161/

这应该有效:

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;
Run Code Online (Sandbox Code Playgroud)


小智 5

根据文档,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;
Run Code Online (Sandbox Code Playgroud)

您还可以有一个单独的文件globals.d.ts,其中包含声明。