如何解决全局 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,其中包含声明。