【问题标题】:How to resolve this typescript error on global node.js object如何解决全局 node.js 对象上的这个打字稿错误
【发布时间】:2021-12-19 08:27:38
【问题描述】:

我正在按照本指南 https://vercel.com/guides/nextjs-prisma-postgres 创建一个完整的堆栈应用程序。 Typescript 在这段代码的 sn-p 中抛出错误:

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;

TypeScript 在global.prisma 上抛出一个ts7017

Element implicitly has an 'any' type because type 'typeof globalThis' has no index signature.

有人可以帮助我理解这一点以及如何解决吗?同时,我在 tsconfig 中将 'strict' 设置为 false 并且同时抑制了该问题,尽管我确信将其关闭会违背 TS 的目的。

【问题讨论】:

  • 你知道global.prisma是如何声明的吗?如果您无权访问它的声明,您是否尝试过使用 global.prisma as PrismaClient 强制转换它?
  • 我不会使用全局的.. 甚至不清楚为什么首先要这样做.. 奇怪!!!他们甚至稍后导入。 import prisma from '../lib/prisma';
  • 来自 Prisma 团队的 Nikolas 在这里!我们建议以这种方式实例化PrismaClient,否则由于 Next.js 的热重载,DB 连接限制会在开发中耗尽。这是我们的文档页面:prisma.io/docs/support/help-articles/…我正在与我们的一些 TypeScript 工程师联系,看看如何解决这个问题。

标签: node.js typescript postgresql next.js prisma


【解决方案1】:

根据docs需要先声明变量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;

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

【讨论】:

  • 你能解释一下写这篇文章的目的吗?未定义?
  • 在这种情况下,管道用于分隔变量 prisma 可能具有的不同类型。通过添加'| undefined' typescript 会在变量被使用时发出警告,而不检查它是否已定义。
  • 感谢您的澄清并帮助我理解 :)
【解决方案2】:

我可以在严格模式为 true 和 @types/node 包版本 16 时重现相同的错误

更新:在此处查看文档中推荐的其他答案https://stackoverflow.com/a/69851359/1345244

这应该可行:

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 2014-10-06
    相关资源
    最近更新 更多