【问题标题】:How to extend globalThis/global type?如何扩展 globalThis/global 类型?
【发布时间】:2021-11-24 08:26:03
【问题描述】:

我正在使用Prisma 编写一个打字稿项目,我在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)的错误消息如下

元素隐含地具有“任何”类型,因为类型“typeof globalThis”没有索引签名。 ts(7017)

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

【问题讨论】:

  • 学习和使用单例模式,这样你就不必像这样破解它了。
  • @AliHabibzadeh 你能举个例子说明你将如何解决这个问题吗?

标签: typescript global prisma


【解决方案1】:

这是 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。滥用强制转换可能会破坏使用 typescript 的价值,但在这种特定情况下我看不出有任何危害或风险。


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


【讨论】:

    猜你喜欢
    • 2020-12-23
    • 2021-04-09
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2015-06-28
    • 2017-02-12
    • 2018-01-03
    • 1970-01-01
    相关资源
    最近更新 更多