如何扩展 globalThis/global 类型?

How to extend globalThis/global type?

我正在使用 Prisma and I saw this code on this guide 开发一个使用打字稿的打字稿项目。但是,我的 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;

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

Element implicitly has an 'any' type because type 'typeof globalThis' has no index signature. ts(7017)

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

这是 Prisma 文档 Best practice for instantiating PrismaClient with Next.js 中建议的解决方案。

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

备选方案

您可以直接将 global 显式转换为 any。滥用转换可能会破坏使用打字稿的价值,但在这个特定的上下文中我没有看到任何伤害或风险。


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;
}