如何解决全局 node.js 对象上的这个打字稿错误
Posted
技术标签:
【中文标题】如何解决全局 node.js 对象上的这个打字稿错误【英文标题】:How to resolve this typescript error on global node.js object 【发布时间】: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 工程师联系,看看如何解决这个问题。
【参考方案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://***.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;
【讨论】:
以上是关于如何解决全局 node.js 对象上的这个打字稿错误的主要内容,如果未能解决你的问题,请参考以下文章