如何解决全局 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 对象上的这个打字稿错误的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 全局对象

使用 Javascript 对象的打字稿

Node.js 全局对象

Node.js 全局对象

Node.js 全局对象

Node.js:get/post请求全局对象工具模块