Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
我不知道你可以使用同级参数作为函数中的默认值_创想鸟

我不知道你可以使用同级参数作为函数中的默认值

我不知道你可以使用同级参数作为函数中的默认值

javascript 从 es2015 开始就支持默认参数值。你知道这一点。我知道这一点。我不知道的是,您可以使用兄弟 参数作为默认值本身。 (或者也许是“相邻位置参数”?不知道如何称呼这些。)

function myfunc(arg1, arg2 = arg1) {  console.log(arg1, arg2);}myfunc("arg1!");// "arg1!" "arg1!"

这也适用于类构造函数 – 我发现这对于使一些 picperf.io 代码更具可测试性非常有帮助。为此目的使用简单的依赖注入是很常见的。让我们来探索一下。

一个场景

与图像优化主题保持一致,假设您有一个 optimizedimage 类。向其构造函数提供图像 url,您可以检索图像的新优化缓冲区或缓存版本。

class optimizedimage {  constructor(    imageurl: string,    cacheservice = new cacheservice(),    optimizeservice = new optimizeservice()  ) {    this.imageurl = imageurl;    this.cacheservice = cacheservice;    this.optimizeservice = optimizeservice;  }  async get() {    const cached = this.cacheservice.get(this.imageurl);    // return the previously optimized image.    if (cached) return cached;    const optimizedimage = await this.optimizeservice      .optimize(this.imageurl);    // cache the optimized image for next time.    return this.cacheservice.put(this.imageurl, optimizedimage);  }}const instance = new optimizedimage('https://macarthur.me/me.jpg');const imgbuffer = await instance.get();

生产中使用的唯一构造函数参数是 imageurl,但注入 cacheservice 和 optimizeservice 可以更轻松地使用模拟进行单元测试:

import { it, expect, vi } from 'vitest';import { optimizedimage } from './main';it('returns freshly optimized image', async function () {  const fakeimagebuffer = new arraybuffer('image!');  const mockcacheservice = {    get: (url) => null,    put: vi.fn().mockresolvedvalue(fakeimagebuffer),  };  const mockoptimizeservice = {    optimize: (url) => fakeimagebuffer,  };  const optimizedimage = new optimizedimage(    'https://test.jpg',    mockcacheservice,    mockoptimizeservice  );  const result = await optimizedimage.get();  expect(result).toequal(fakeimagebuffer);  expect(mockcacheservice.put).tohavebeencalledwith(    'https://test.jpg',    'optimized image'  );});

让它变得更加复杂

在该示例中,这两个服务类仅在调用特定方法时才使用 imageurl。但想象一下,如果他们需要将其传递给自己的构造函数。您可能会想将实例化到 optimizedimage 的构造函数中(我就是这样):

class optimizedimage {  constructor(    imageurl: string  ) {    this.imageurl = imageurl;    this.cacheservice = new cacheservice(imageurl);    this.optimizeservice = new optimizeservice(imageurl);  }

那是可行的,但现在 optimizedimage 完全负责服务实例化,测试也变得更加麻烦。传入服务实例的模拟并不是那么容易。

您可以通过传入模拟类定义来解决这个问题,但是您随后需要使用这些类自己的构造函数创建这些类的模拟版本,这使得测试变得更加乏味。幸运的是,还有另一种选择:在参数列表的其余部分中使用 imageurl 参数。

共享同级参数

直到不久前我才意识到这是可能的。它的外观如下:

export class optimizedimage {  constructor(    imageurl: string,    // use the same `imageurl` in both dependencies.    cacheservice = new cacheservice(imageurl),    optimizeservice = new optimizeservice(imageurl)  ) {    this.cacheservice = cacheservice;    this.optimizeservice = optimizeservice;  }  async get() {    const cached = this.cacheservice.get();    // return the previously optimized image.    if (cached) return cached;    const optimizedimage = await this.optimizeservice.optimize();    // cache the optimized image for next time.    return this.cacheservice.put(optimizedimage);  }}

通过此设置,您可以像以前一样轻松地模拟这些实例,并且类的其余部分甚至不需要保留 imageurl 本身的实例。当然,实例化仍然很简单:

const instance = new optimizedimage('https://macarthur.me/me.jpg');const img = await instance.get();

相同的测试方法也保持不变:

import { it, expect, vi } from 'vitest';import { OptimizedImage } from './main';it('returns freshly optimized image', async function () {  const mockCacheService = {    get: () => null,    put: vi.fn().mockResolvedValue('optimized image'),  };  const mockOptimizeService = {    optimize: () => 'optimized image',  };  const optimizedImage = new OptimizedImage(    'https://test.jpg',    mockCacheService,    mockOptimizeService  );  const result = await optimizedImage.get();  expect(result).toEqual('optimized image');  expect(mockCacheService.put).toHaveBeenCalledWith('optimized image');});

这里没有什么突破性的东西——只是一个小功能,让我的生活更加符合人体工程学。希望以后能遇到更多这样的宝石。

以上就是我不知道你可以使用同级参数作为函数中的默认值的详细内容,更多请关注创想鸟其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
这就是我的编码方式
上一篇 2025年12月19日 15:30:58
JavaScript 的有趣之处以及 TypeScript 如何让它变得更好
下一篇 2025年12月19日 15:31:17

相关推荐

  • laravel怎么记录和查看SQL查询日志_laravel SQL查询日志记录与查看方法

    laravel怎么记录和查看SQL查询日志_laravel SQL查询日志记录与查看方法laravel怎么记录和查看SQL查询日志_laravel SQL查询日志记录与查看方法laravel怎么记录和查看SQL查询日志_laravel SQL查询日志记录与查看方法laravel怎么记录和查看SQL查询日志_laravel SQL查询日志记录与查看方法

    首先启用查询日志功能,通过DB::connection()->enableQueryLog()开启并用getQueryLog()获取SQL语句;其次利用DB::listen()监听查询事件,将SQL、参数和执行时间写入日志;最后可在config/database.php中为数据库连接添加&#8…

    2026年9月27日 • 用户投稿
    000
  • ubuntu怎么切换到windows10

    ubuntu怎么切换到windows10ubuntu怎么切换到windows10ubuntu怎么切换到windows10ubuntu怎么切换到windows10

    要从 Ubuntu 切换到 Windows 10:关机或重启 Ubuntu。在 GRUB 启动菜单中选择“Windows Boot Manager”。按 Enter 键加载 Windows 10 的引导加载程序。等待 Windows 10 加载。输入密码并登录 Windows 10。 如何从 Ubu…

    2026年9月27日 • 用户投稿
    000
  • 京东没有优衣库旗舰店吗?旗舰店的产品靠谱吗?官方正品保障全解析

    京东没有优衣库旗舰店吗?旗舰店的产品靠谱吗?官方正品保障全解析京东没有优衣库旗舰店吗?旗舰店的产品靠谱吗?官方正品保障全解析京东没有优衣库旗舰店吗?旗舰店的产品靠谱吗?官方正品保障全解析京东没有优衣库旗舰店吗?旗舰店的产品靠谱吗?官方正品保障全解析

    近期不少消费者都在关注“京东是否有优衣库旗舰店?”,事实上,优衣库早在2016年便正式入驻京东,开设了官方旗舰店并长期稳定运营。作为uniqlo在中国市场的重要电商布局之一,用户只需在京东app搜索栏输入“优衣库官方旗舰店”即可直达店铺页面,首页显著位置清晰展示品牌授权书及官方认证标识,确保购物安心…

    2026年9月27日 • 用户投稿
    000
  • Struts 2与AJAX集成:正确处理JSON响应的教程

    Struts 2与AJAX集成:正确处理JSON响应的教程Struts 2与AJAX集成:正确处理JSON响应的教程Struts 2与AJAX集成:正确处理JSON响应的教程Struts 2与AJAX集成:正确处理JSON响应的教程

    本教程旨在解决Struts 2在使用AJAX返回JSON数据时常见的解析错误问题。当手动将JSON字符串写入响应流时,Struts 2的JSON插件会因无法找到可序列化的Action属性而导致客户端接收到无效响应。文章将详细阐述如何通过在Action中定义带有Getter方法的属性,并利用Strut…

    2026年9月27日 • 用户投稿
    000
  • win7中使用腾讯手游助手来自己录制视频的方法

    win7中使用腾讯手游助手来自己录制视频的方法win7中使用腾讯手游助手来自己录制视频的方法win7中使用腾讯手游助手来自己录制视频的方法win7中使用腾讯手游助手来自己录制视频的方法

    我们在windows 7系统的电脑上使用时发现,自媒体的普及程度非常高。有些朋友想通过腾讯手游助手来录制视频,但不知道具体的操作步骤。今天,我就来教大家如何在windows 7系统中利用腾讯手游助手进行视频录制。如果你对此感兴趣,不妨跟着我的步骤一起学习吧。 以下是具体的操作方法和详细步骤: 1、首…

    2026年9月27日 • 用户投稿
    000
  • Oracle数据库性能调优实战技巧

    Oracle数据库性能调优实战技巧Oracle数据库性能调优实战技巧Oracle数据库性能调优实战技巧Oracle数据库性能调优实战技巧

    标题:Oracle数据库性能调优实战技巧 在当今信息时代,数据库已经成为企业数据存储和管理不可或缺的重要组成部分。而Oracle作为业界领先的关系数据库管理系统(RDBMS),在企业中应用广泛。然而,随着数据量的不断增加,数据库性能的优化变得尤为重要。本文将介绍一些Oracle数据库性能调优的实战技…

    2026年9月27日 • 用户投稿
    100
  • 小红书创作者服务平台 小红书创作者官网入口

    小红书创作者服务平台 小红书创作者官网入口小红书创作者服务平台 小红书创作者官网入口小红书创作者服务平台 小红书创作者官网入口小红书创作者服务平台 小红书创作者官网入口

    小红书创作者服务平台官网入口为https://creator.xiaohongshu.com/,平台提供创作学习课程、机构入驻申请、账号统一管理、合作进度查询等功能,支持内容孵化与变现。 小红书创作者服务平台官网入口地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来小红书创作者服务平台官…

    2026年9月27日 • 用户投稿
    800
  • Struts 2与AJAX集成:JSON响应解析失败的排查与解决

    Struts 2与AJAX集成:JSON响应解析失败的排查与解决Struts 2与AJAX集成:JSON响应解析失败的排查与解决Struts 2与AJAX集成:JSON响应解析失败的排查与解决Struts 2与AJAX集成:JSON响应解析失败的排查与解决

    本教程深入探讨Struts 2与AJAX集成时JSON响应解析失败的常见问题。核心在于Struts 2 JSON插件的序列化机制,它默认序列化Action的公共属性而非手动写入的流。通过在Action中定义可序列化的属性并正确配置Struts.xml,可以有效解决JSON解析错误,实现前后端数据流畅…

    2026年9月27日 • 用户投稿
    100
  • 快手小店保证金500可以退吗?需要什么条件?一文读懂退款条件及流程

    快手小店保证金500可以退吗?需要什么条件?一文读懂退款条件及流程快手小店保证金500可以退吗?需要什么条件?一文读懂退款条件及流程快手小店保证金500可以退吗?需要什么条件?一文读懂退款条件及流程快手小店保证金500可以退吗?需要什么条件?一文读懂退款条件及流程

    随着短视频电商的迅猛发展,越来越多的商家开始入驻快手小店。在开店过程中,500元保证金成为新手最为关注的问题之一。许多创业者都在关心:这笔费用是否可以退还?需要满足哪些具体条件?本文将从平台规则、操作步骤以及常见疑问三个方面,深入解读快手小店保证金的退还机制。 一、快手小店保证金退还的关键条件 根据…

    2026年9月27日 • 用户投稿
    100
  • 如何利用JavaScript的反射(Reflect)API进行元编程?

    Reflect API提供统一函数化方式操作对象,支持属性读写(Reflect.get/set)、方法调用(Reflect.apply)、实例构造(Reflect.construct)及元信息查询(如has、ownKeys),相比传统操作更安全且与Proxy协同更佳。 JavaScript的Refl…

    2026年9月27日
    200
  • Java集合框架中常见性能陷阱及优化

    Java集合框架在日常开发中使用频繁,但若不注意使用方式,很容易引发性能问题。很多看似简单的操作背后可能隐藏着较高的时间或空间开销。了解这些常见陷阱并采取相应优化措施,能显著提升程序效率。 1. ArrayList 频繁扩容导致性能下降 ArrayList 内部基于数组实现,当元素数量超过当前容量时…

    2026年9月27日
    100
  • VSCode怎样区分工作区与文件夹的使用场景 VSCode新手理解工作区与文件夹的基础指南​

    vscode中工作区是文件夹的逻辑组合并保存配置,用于多项目管理。1. 单文件夹项目可直接打开,视为隐式工作区,配置存于.vscode目录;2. 多根目录项目应创建.code-workspace文件,显式定义多个文件夹及共享设置;3. 配置优先级为全局 < 工作区 < 文件夹,后续设置覆…

    2026年9月27日
    100
  • 硬盘分区丢失了怎么办?恢复分区的有效方法有哪些?

    硬盘分区丢失后应立即停止写入操作,使用TestDisk、DiskGenius等工具扫描恢复分区表,优先尝试免费软件,重要数据建议选用付费工具或专业服务。 硬盘分区丢失,这事儿确实挺让人头疼的,尤其是里面存着重要数据的时候。不过别慌,大多数情况下,分区丢失并不是世界末日,数据还是有很大机会能找回来的。…

    2026年9月27日
    200
  • OpenJDK 15+ 内存优化:深入理解大堆场景下的压缩类指针

    OpenJDK 15+ 内存优化:深入理解大堆场景下的压缩类指针OpenJDK 15+ 内存优化:深入理解大堆场景下的压缩类指针OpenJDK 15+ 内存优化:深入理解大堆场景下的压缩类指针OpenJDK 15+ 内存优化:深入理解大堆场景下的压缩类指针

    Java 15及更高版本在处理超过32GB的大堆内存时,通过独立压缩类指针(Compressed Class Pointers)显著优化了对象的内存占用。这一改进使得即使对象引用本身无法压缩,对象的元数据开销也能保持较低水平,从而提升了内存效率,解决了早期Java版本中压缩类指针与压缩对象指针绑定导…

    2026年9月27日 • 用户投稿
    100
  • 平安好车主怎么修改个人信息_平安好车主修改个人信息详细方法

    平安好车主怎么修改个人信息_平安好车主修改个人信息详细方法平安好车主怎么修改个人信息_平安好车主修改个人信息详细方法平安好车主怎么修改个人信息_平安好车主修改个人信息详细方法平安好车主怎么修改个人信息_平安好车主修改个人信息详细方法

    1、修改实名信息需进入“我的”-“实名认证”编辑并上传身份证件等待审核;2、更新头像简介可在“个人信息页”直接修改并保存;3、更换手机号需在“账户与安全”中验证原号并绑定新号。 如果您需要更新在平安好车主App中的个人资料,例如姓名、身份证信息或联系方式,可以通过账户设置中的相应功能进行调整。以下是…

    2026年9月27日 • 用户投稿
    000
  • Oracle函数的定义和用途深度解析

    Oracle函数的定义和用途深度解析Oracle函数的定义和用途深度解析Oracle函数的定义和用途深度解析Oracle函数的定义和用途深度解析

    Oracle函数是数据库中一种非常重要的对象,它可以接收输入参数并返回一个值。在Oracle中,函数通常用于封装一些公共的逻辑或计算操作,以便在不同的地方重复使用。本文将深度解析Oracle函数的定义和用途,并提供具体的代码示例。 1. Oracle函数的定义 在Oracle数据库中,函数是一种存储…

    2026年9月27日 • 用户投稿
    000
  • 怎么用豆包AI帮我写PHP Laravel路由 用AI构建RESTful API的秘诀

    怎么用豆包AI帮我写PHP Laravel路由 用AI构建RESTful API的秘诀怎么用豆包AI帮我写PHP Laravel路由 用AI构建RESTful API的秘诀怎么用豆包AI帮我写PHP Laravel路由 用AI构建RESTful API的秘诀怎么用豆包AI帮我写PHP Laravel路由 用AI构建RESTful API的秘诀

    使用豆包ai写php laravel路由的关键在于清晰描述需求。1. 明确说明api结构,如“管理商品的api路由,需分页、认证中间件、路径前缀是/api/v1”,ai会生成对应路由代码并可限制暴露方法;2. 告知laravel版本及是否启用api路由,避免冗余代码或遗漏配置;3. 让ai生成控制器…

    2026年9月27日 • 用户投稿
    100
  • laravel怎么为模型属性添加readonly特性_laravel模型属性readonly特性设置方法

    laravel怎么为模型属性添加readonly特性_laravel模型属性readonly特性设置方法laravel怎么为模型属性添加readonly特性_laravel模型属性readonly特性设置方法laravel怎么为模型属性添加readonly特性_laravel模型属性readonly特性设置方法laravel怎么为模型属性添加readonly特性_laravel模型属性readonly特性设置方法

    可通过访问器、模型事件或数据库设计实现只读属性。1. 使用setXxxAttribute在模型已存在时阻止赋值;2. 利用updating事件还原被修改的字段;3. 不将字段加入$fillable,仅创建时赋值;4. 定义访问器创建虚拟只读属性。推荐结合模型事件与数据库约束确保安全性。 在 Lara…

    2026年9月27日 • 用户投稿
    000
  • PCIe5.0通道分配测试:X670E主板扩展性实测

    PCIe5.0通道分配测试:X670E主板扩展性实测PCIe5.0通道分配测试:X670E主板扩展性实测PCIe5.0通道分配测试:X670E主板扩展性实测PCIe5.0通道分配测试:X670E主板扩展性实测

    pcie 5.0通道分配在x670e主板上的扩展性表现出色,能够满足高性能需求的用户:1) pcie 5.0提供的带宽是pcie 4.0的两倍,显著提升数据传输速度;2) 主板设计者巧妙分配通道,最大化性能,如优先分配给显卡和nvme ssd;3) x670e主板在多设备连接时表现稳定,管理带宽分配…

    2026年9月27日 • 用户投稿
    200
  • 京东两个地址可以合并下单吗?为什么?深度解析多地址购物规则

    京东两个地址可以合并下单吗?为什么?深度解析多地址购物规则京东两个地址可以合并下单吗?为什么?深度解析多地址购物规则京东两个地址可以合并下单吗?为什么?深度解析多地址购物规则京东两个地址可以合并下单吗?为什么?深度解析多地址购物规则

    在京东购物时,不少消费者都曾面临类似的疑问:当需要为不同地址的亲友选购商品时,是否可以将多个收货地址的物品合并成一个订单完成支付?这个问题虽然表面简单,但背后牵涉到京东平台的订单架构、促销机制以及物流调度等多个系统层面的设计。本文将全面解析京东多地址下单的相关规则,并深入探讨其背后的运行逻辑。 一、…

    2026年9月27日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信