Prisma Client 扩展类型提取与模块化管理教程

Prisma Client 扩展类型提取与模块化管理教程

本文旨在解决prisma client扩展在模块化组织时遇到的类型复杂性问题。通过深入分析prisma `$extends` 方法的类型结构,我们将学习如何利用%ignore_a_1%的 `extract` 和 `parameters` 工具类型,从基础prisma客户端中精确提取出扩展配置的类型定义。这种方法能有效实现扩展逻辑的分离,同时确保完整的类型安全和代码可维护性。

理解 Prisma Client 扩展及其类型挑战

Prisma Client 扩展(Extensions)是Prisma提供的一项强大功能,允许开发者在不修改生成客户端代码的情况下,为Prisma Client添加自定义逻辑、修改查询行为或引入新的模型方法。这对于实现业务逻辑、审计日志、多租户等场景非常有用。

例如,我们可能需要为 Company 模型的 update 操作添加特定逻辑,如当公司状态变为 DECLINED 时,自动锁定关联用户的账户。

import { PrismaClient, CompanyStatus, AccountLockedReason } from '@prisma/client';const _prismaClient = new PrismaClient(); // 基础 PrismaClient 实例const prismaClient = _prismaClient.$extends({  query: {    company: {      update: async ({ args, query }) => {        if (args.data?.status === CompanyStatus.DECLINED) {          args.data.user = {            update: {              accountLocked: AccountLockedReason.COMPANY_DECLINED,            },          };        }        return query(args);      },    },  },});export type ExtendedPrismaClient = typeof prismaClient;

虽然上述代码在单个文件中运行良好,但随着项目规模的扩大和扩展逻辑的增多,将所有扩展集中在一个文件中会导致代码臃肿且难以维护。理想情况下,我们希望将不同模型的扩展逻辑分离到各自的文件中,例如将 company 相关的扩展逻辑放入 companyExtensions.ts。

模块化扩展的挑战:类型安全

当尝试将扩展逻辑分离时,最大的挑战在于如何为分离出的对象提供准确的TypeScript类型定义,以确保在外部文件中编写扩展时依然能获得完整的类型提示和检查。

考虑以下分离尝试:

// companyExtensions.ts// 我们需要为 companyExtensions 提供一个类型定义export const companyExtensions = {  update: async ({ args, query }) => {    if (args.data?.status === CompanyStatus.DECLINED) {      args.data.user = {        update: {          accountLocked: AccountLockedReason.COMPANY_DECLINED,        },      };    }    return query(args);  },};// prismaClient.tsimport { PrismaClient } from '@prisma/client';import { companyExtensions } from './companyExtensions';const _prismaClient = new PrismaClient();const prismaClient = _prismaClient.$extends({  query: {    company: companyExtensions, // 这里需要 companyExtensions 具有正确的类型  },});

直接将 companyExtensions 定义为一个匿名对象会导致其内部的 args 和 query 参数失去类型信息。简单的尝试,如 type CompanyExtensions = Parameters[0],也往往不能奏效,原因在于 prismaClient 已经是扩展过的实例,其 $extends 方法的类型可能更复杂,且我们通常需要的是未扩展的基客户端的扩展参数类型。此外,Parameters[0] 得到的类型可能是一个非常宽泛的联合类型,难以直接用于局部定义。

Prisma 提供了 defineExtension 函数,但它主要用于发布通用的、可分发的客户端扩展,并且通常不包含针对特定模型参数的详细类型信息,这与我们为特定应用场景定义细粒度扩展的需求不完全匹配。

解决方案:利用 TypeScript 工具类型精确提取

解决这个问题的关键在于利用 TypeScript 的高级工具类型 Parameters 和 Extract,从基础的 _prismaClient 实例中精确地提取出 $extends 方法的配置对象类型。

序列猴子开放平台 序列猴子开放平台

具有长序列、多模态、单模型、大数据等特点的超大规模语言模型

序列猴子开放平台 56 查看详情 序列猴子开放平台

获取 $extends 方法的参数类型Parameters[0] 会返回 _prismaClient.$extends 方法的第一个参数的类型。这个参数是一个包含 query、model、client 等属性的配置对象,其类型通常是一个复杂的联合类型。

使用 Extract 缩小类型范围Extract 工具类型用于从 Type 中提取所有可赋值给 Union 的成员。在这里,我们可以利用 $extends 配置对象的一个共同特征——它通常包含一个可选的 name 属性(尽管我们不一定使用它),来帮助 TypeScript 准确识别出我们需要的配置对象结构。

结合以上两点,我们可以定义一个通用的 ExtensionArgs 类型:

// types/prisma-extensions.d.ts 或任何 .ts 文件import { PrismaClient } from '@prisma/client';// 假设 _prismaClient 是未扩展的 PrismaClient 实例// 这里我们使用 typeof new PrismaClient() 来获取基础客户端的类型// 避免循环依赖,或者从一个已知的基础客户端实例获取类型type BasePrismaClient = PrismaClient; // 也可以直接使用 PrismaClient/** * 提取 Prisma Client $extends 方法的配置参数类型。 * 通过 Extract 来筛选出符合扩展配置对象特征的类型。 * 这有助于从复杂的联合类型中精确地获取所需的类型结构。 */export type ExtensionArgs = Extract<  Parameters[0],  { name?: string }>;

现在,我们可以使用 ExtensionArgs 来定义我们的模块化扩展:

// companyExtensions.tsimport { CompanyStatus, AccountLockedReason } from '@prisma/client';import { ExtensionArgs } from './types/prisma-extensions'; // 导入我们定义的类型// 声明 companyExtensions 为 ExtensionArgs 类型的一部分// 这里我们只关注 query.company 部分,所以可以进一步缩小类型export const companyExtensions: ExtensionArgs['query']['company'] = {  update: async ({ args, query }) => {    if (args.data?.status === CompanyStatus.DECLINED) {      args.data.user = {        update: {          accountLocked: AccountLockedReason.COMPANY_DECLINED,        },      };    }    return query(args);  },};
// prismaClient.tsimport { PrismaClient } from '@prisma/client';import { companyExtensions } from './companyExtensions';const _prismaClient = new PrismaClient(); // 基础 PrismaClient 实例export const prismaClient = _prismaClient.$extends({  query: {    company: companyExtensions,  },});export type ExtendedPrismaClient = typeof prismaClient;

通过这种方式,companyExtensions 对象现在拥有了完整的类型信息。在编写 update 方法时,args 和 query 参数将获得 Prisma 提供的精确类型提示,包括 args.data 的结构、args.where 等。

总结与注意事项

使用未扩展的客户端类型: 在提取 ExtensionArgs 时,务必使用 _prismaClient(即未扩展的 PrismaClient 实例)的类型,或者直接使用 PrismaClient 类型本身。如果使用已经扩展过的客户端,其 $extends 方法的参数类型可能已经发生变化,导致提取的类型不准确。{ name?: string } 的作用: Extract 结合 { name?: string } 是一种巧妙的方法,用于从 $extends 方法参数的复杂联合类型中“挑选”出代表整个扩展配置对象的那个成员。这是因为 Prisma 内部的扩展配置对象通常会包含一个可选的 name 属性。模块化优势: 这种方法极大地提高了代码的可维护性和可读性。你可以为每个模型或每个功能领域创建独立的扩展文件,每个文件都享有完整的类型安全。通用性: 这种类型提取模式不仅适用于 query 扩展,也适用于 model 和 client 扩展,只需根据需要调整 ExtensionArgs[‘query’][‘company’] 到 ExtensionArgs[‘model’][‘YourModel’] 或 ExtensionArgs[‘client’] 即可。

通过上述方法,开发者可以自信地将 Prisma Client 扩展拆分到独立的模块中,同时享受 TypeScript 带来的强大类型检查和开发体验,从而构建出更加健壮和易于管理的应用。

以上就是Prisma Client 扩展类型提取与模块化管理教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/876760.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月28日 07:49:18
下一篇 2025年11月28日 07:49:40

相关推荐

  • 币圈交易深度最好的十大平台榜单出炉

    平台深度代表买卖盘支撑力强弱,对于大额交易者极为关键。以下是根据2025年最新市场报告及流动性研究,综合整理出的“交易深度最好的十大交易所”榜单,反映在紧密价位范围内的现货及期货深度表现。 1. Binance(币安) BTC现货及合约深度最高,±$100价域均有约800万美元买卖盘 交易对丰富,流…

    2025年12月8日 好文分享
    000
  • 手机看比特币行情用哪个App好?比特币行情App实测推荐

    对于刚进入币圈的新手而言,选择一款功能全面、界面清晰、数据准确的比特币行情app非常关键。市面上虽有不少工具,但实际体验上差异明显,尤其在行情更新速度、深度图展示、k线图功能、中文支持等方面尤为重要。 以下是2025年新手用户实测后的推荐榜单,涵盖使用流畅性、数据深度、界面友好度等多个维度。 1. …

    2025年12月8日 好文分享
    000
  • 比特币实时行情价格走势app 比特币今日k线图在线查询

    比特币(Bitcoin,简称BTC)是全球第一种,也是最知名的加密数字货币。它基于去中心化的点对点网络技术,不依赖于任何中央银行或政府机构发行和管理。作为一个开创性的数字资产,比特币的价值和价格波动吸引了全球众多投资者和技术爱好者的关注,其K线图走势是判断市场情绪和未来趋势的重要依据。 本文为用户提…

    2025年12月8日
    000
  • 用户常用的比特币行情查询工具推荐

    在虚拟币市场中,准确掌握比特币实时价格对投资决策至关重要。下面推荐几款被用户广泛使用的比特币行情查询工具,适合初学者与日常跟踪使用者。 1. 非小号 中文界面清晰,专为华语用户设计,提供比特币价格、市值、24小时涨跌幅以及主流交易所报价,数据更新及时。 2. MyToken 支持查看多平台的比特币报…

    2025年12月8日 好文分享
    000
  • 投资人都在用的币圈行情网站有哪些?

    在币圈中,准确快速地获取行情信息是每位投资人关注的重点。以下是被大量投资人日常使用的主流币圈行情网站,提供价格、涨跌幅、成交量等多维度数据。 1. 非小号 国内最常用的币种数据平台,支持多币种价格查询、K线图分析、项目资料等,适合跟踪热点走势。 2. CoinMarketCap 全球币种数据最全的网…

    2025年12月8日 好文分享
    000
  • 瑞波币的RLUSD:稳定币领域的新任执法者?

    深入解析瑞波币的 rlusd:xrp 生态中的新势力,稳定币市场的新挑战者? 加密世界的玩家们,准备好了吗?Ripple 推出的 RLUSD 稳定币正在引发广泛关注。它是否意图挑战 USDC 的主导地位?抑或它承载着更宏大的愿景?让我们一同揭开它的神秘面纱。 RLUSD:不止于稳定币的定义 围绕 R…

    2025年12月8日
    000
  • 以太坊、稳定币与加密股票:一个新时代?

    探索以太坊的主导地位、稳定币监管和加密股票的崛起。以太坊是新金融格局的基石吗? 以太坊、稳定币与加密股票:一个新时代? 数字金融世界正在快速重塑,以太坊、稳定币和加密股票逐渐成为关注的中心。接下来,我们将深入探讨这些领域的重要进展,以及它们对投资者和未来金融体系带来的影响。 以太坊:稳定币革命的基石…

    2025年12月8日
    000
  • Chainlink价格预测:LINK会突破吗?

    chainlink(link)正在蓄势待发!解析最新走势、价格展望与突破可能性 Chainlink价格展望:LINK能否实现突破? Chainlink(LINK)再度引发市场关注!随着新的合规解决方案及支持加密资产的法规逐步落地,关于其价格是否能实现突破的讨论也愈发热烈。本文将聚焦最新的价格预测,并…

    2025年12月8日
    000
  • 以太坊、山寨币与机构需求:一个新时代?

    探索以太坊与山寨币日益增强的机构吸引力,这一趋势正受到技术创新与监管明朗化的推动。 以太坊、山寨币与机构需求:是否标志着一个新时代的开启? 加密资产市场正变得愈发活跃!以太坊及部分主流山寨币正迎来机构投资者的强劲需求。在技术演进与监管框架逐渐清晰的背景下,数字资产是否正步入一个全新的发展阶段? 以太…

    2025年12月8日
    000
  • CAKE、加密支付与2025年崛起:正在酝酿什么?

    探索 pancakeswap 的 cake 代币在 2025 年加密支付中的应用:风险、趋势与洞察。这是甜蜜的交易,还是灾难的配方? 加密世界从不停歇,而如今,人们的目光纷纷投向 PancakeSwap 的 CAKE 代币在未来的支付场景中所扮演的角色。随着 2025 年的到来,我们来分析一下 CA…

    2025年12月8日
    000
  • AAVE的看涨形态:超级趋势、关键水平及后市展望

    aave 显现“超级趋势”买入信号与杯柄形态突破,预示潜在上涨可能。它是否能突破阻力,还是会遭遇卖方压制? AAVE 的看涨信号:超级趋势、关键位置与未来动向 朋友们注意了,AAVE 正在发出强烈的看涨信号!随着“超级趋势”买入信号的出现,以及杯柄形态的突破,我们似乎正站在新一轮上涨行情的起点。当然…

    2025年12月8日
    000
  • 欧易OKE交易所官网版 v6.131.0 2025安卓版APP官方

    欧易OKE是一款全球知名的数字资产交易平台,致力于为全球用户提供安全、稳定、可靠的数字资产交易服务。它支持数百种币对的交易,并提供丰富的金融工具。 本文将为您提供欧易oke交易所官网版 v6.131.0的官方安卓app下载链接,用户点击本文中提供的下载链接,即可快速获取最新版本的官方应用程序,开启便…

    2025年12月8日
    000
  • 贝莱德的大赌注:为何比特币和以太坊是未来

    贝莱德正在加密货币领域掀起巨大波澜!了解他们为何对比特币和以太坊的大规模投资,预示着机构投资者思维的重大转变。 贝莱德的大胆布局:比特币与以太坊为何成为未来焦点 贝莱德最近在加密货币市场的一系列动作引起广泛关注。随着其在比特币和以太坊上的巨额投资,机构对数字资产的兴趣正以前所未有的速度增长。让我们深…

    2025年12月8日
    000
  • BlockDAG、Aave 和 Render 代币:绘制加密货币下一章的路线图

    探索 blockdag、aave 和 render token 的创新突破,揭示它们在加密生态系统中的独特路径与实际应用潜力。 加密领域持续演进,BlockDAG、Aave 与 Render Token 成为当前关注焦点。让我们深入剖析这些项目为何备受瞩目,以及它们如何在数字金融与内容创作领域带来变…

    2025年12月8日
    000
  • 印度富豪拥抱加密货币:数字投资的新时代

    印度顶级投资者正将目光投向加密货币,受比特币价格飙升和全球市场信心增强的影响,国内交易所纷纷报告高净值人群(hni)的参与度大幅提升。 印度富豪拥抱加密货币:数字投资新时代 随着比特币价格持续走高,全球对数字资产的信心不断增强,印度富裕阶层正积极进入加密货币领域。多家本土交易所表示,高净值个人和家族…

    2025年12月8日
    000
  • BlockDAG、ICP 和 SEI:探索加密货币领域

    探索 blockdag、icp 与 sei 的最新趋势:从 blockdag 的预售成功,到 icp 的韧性表现,再到 sei 对 defi 的专注。 BlockDAG、ICP 与 SEI:穿越加密货币格局 加密货币市场正迎来新一轮热潮,BlockDAG、Internet Computer(ICP)…

    2025年12月8日
    000
  • FloppyPepe:这种模因币能否以15,800%的回报率助你成为加密货币百万富翁?

    floppypepe 凭借其“模因+实用”的创新模式引发了广泛关注,对于早期投资者来说,它或许提供了一个通过高达 15,800% 的投资回报率(roi)成为加密百万富翁的机会。 FloppyPepe:这款模因币能让你成为加密百万富翁,并带来 15,800% 的回报吗? 随着模因币再度兴起,Flopp…

    2025年12月8日
    000
  • FloppyPepe:下一个造就百万富翁的加密货币?投资回报潜力与模因币的演变

    随着加密货币市场价值持续攀升,floppypepe 成为了备受瞩目的潜在百倍币,它巧妙融合了迷因文化与 web3 的实用价值。它是否会成为下一个“狗狗币”或“pepe”? 加密市场正迈向 4 万亿美元的门槛,虽然比特币依旧主导涨势,但迷因币正成为市场焦点。FloppyPepe(FPPE)凭借其强劲的…

    2025年12月8日
    000
  • 币圈牛市未来:驾驭加密货币领域

    加密货币牛市前景分析:把握数字资产新机遇 加密市场正迎来新一轮关注!围绕“加密货币、牛市、未来”的讨论热度持续上升,市场展现出潜在上升趋势,同时监管格局也在逐步调整。让我们共同探索影响加密货币发展进程的关键因素。 历史的启示:是否会再现往日辉煌? 最新市场数据显示,当前市场状况与2017年比特币暴涨…

    2025年12月8日
    000
  • 韩国稳定币激增:Web3创新热潮升温

    韩国web3生态崛起:稳定币革新带动黑客马拉松、ai融合与政策扶持,这是数字金融的未来方向吗? 韩国稳定币热潮:Web3创新持续升温 稳定币、Web3与韩国的结合正展现出前所未有的活力!从创新的黑客马拉松到人工智能驱动的应用,韩国的数字资产领域正快速推进。让我们深入探讨这些关键动态及其对金融未来的影…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信