如何扩展globalThis/global类型?

For*_*orm 5 global typescript prisma

我正在使用Prisma开发一个打字稿项目,我在本指南上看到了使用打字稿的代码。然而,我的 linter 给出了以下代码的错误。

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)

第 8,9,11 行(对于 )的错误消息global.prisma如下

元素隐式具有“any”类型,因为类型“typeof globalThis”没有索引签名。TS(7017)

如何扩展 globalThis 或 global with 的类型,Prismaclient使其按预期工作?

Tas*_*mam 18

以下是Prisma 文档中使用 Next.js 实例化 PrismaClient 的最佳实践中建议的解决方案。

import { PrismaClient } from '@prisma/client'

declare global {
  var prisma: PrismaClient | undefined
}

export const prisma =
  global.prisma ||
  new PrismaClient()

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

Run Code Online (Sandbox Code Playgroud)

替代解决方案

您可以直接显式转换globalany. 滥用强制转换可能会削弱使用打字稿的价值,但在这种特定情况下,我没有看到任何危害或风险。


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


Run Code Online (Sandbox Code Playgroud)