解构赋值在 TypeScript 中的妙用:以 Babylon.js 的 loadModel 函数为例

        在现代 JavaScript 和 TypeScript 开发中,解构赋值(Destructuring Assignment)是一种非常实用的特性,它能够让代码更加简洁、易读且高效。今天,我们就通过一个实际的例子——在 Babylon.js 中加载 3D 模型的   loadModel   函数,来深入探讨解构赋值的妙用。

1. 解构赋值简介 

        解构赋值是一种从数组或对象中提取数据并将其赋值给变量的语法。它允许我们直接从复杂的数据结构中提取所需的值,而无需通过多层嵌套的访问。解构赋值不仅让代码更加简洁,还提高了代码的可读性和可维护性。

1.1 对象解构

         假设我们有一个对象,包含多个属性,例如:

const result = {meshes: ["mesh1", "mesh2"],skeletons: ["skeleton1"],particleSystems: ["particleSystem1"]
};

        如果不使用解构赋值,我们通常会这样访问这些属性:

const meshes = result.meshes;
const skeletons = result.skeletons;
const particleSystems = result.particleSystems;

        使用解构赋值后,代码可以简化为:

const { meshes, skeletons, particleSystems } = result;

        这样,  meshes  、  skeletons   和   particleSystems   直接被赋值为对象中的对应属性值。

 1.2 提供默认值

        如果某个属性可能不存在,我们可以为它提供一个默认值。例如:

const { meshes = [], skeletons = [], particleSystems = [] } = result;

        如果   result   中没有   meshes  、  skeletons   或   particleSystems   属性,它们将分别被赋值为空数组   []  。

 2. 在 Babylon.js 中的应用

        在 Babylon.js 中,  SceneLoader.ImportMeshAsync   是一个异步函数,用于加载 3D 模型。它返回一个对象,包含加载的网格(  meshes  )、骨骼(  skeletons  )和粒子系统(  particleSystems  )等信息。我们可以通过解构赋值来简化对这些属性的访问。 

2.1 示例代码 

import { Scene, SceneLoader } from 'babylonjs';async function loadModel(scene: Scene, modelPath: string): Promise<void> {try {// 使用解构赋值提取 meshes 属性const { meshes } = await SceneLoader.ImportMeshAsync("", modelPath, "model.glb", scene);console.log("Model loaded successfully:", meshes);} catch (error) {console.error("Failed to load model:", error);}
}

 2.2 代码解析

 1. 调用   SceneLoader.ImportMeshAsync  :
  • SceneLoader.ImportMeshAsync   是一个异步函数,返回一个   Promise  ,该   Promise   在模型加载完成后被   resolve  。
  • 它返回一个对象,包含多个属性,如   meshes  、  skeletons   和   particleSystems  。 
 2. 使用解构赋值提取   meshes  :
  •  const { meshes } = ...   使用解构赋值从返回的对象中提取   meshes   属性。
  • 如果返回的对象中没有   meshes   属性,  meshes   将被赋值为   undefined  。
 3. 错误处理
  •  使用   try...catch   捕获加载过程中可能出现的错误,并通过   console.error   输出错误信息。

2.3 不使用解构赋值的对比 

        如果不使用解构赋值,代码将变得冗长: 

async function loadModel(scene: Scene, modelPath: string): Promise<void> {try {const result = await SceneLoader.ImportMeshAsync("", modelPath, "model.glb", scene);const meshes = result.meshes;console.log("Model loaded successfully:", meshes);} catch (error) {console.error("Failed to load model:", error);}
}

        通过使用解构赋值,我们可以直接提取所需的属性,使代码更加简洁。 

3. 解构赋值的其他用途

3.1 提取多个属性 

        可以同时提取多个属性: 

const { meshes, skeletons, particleSystems } = await SceneLoader.ImportMeshAsync("", modelPath, "model.glb", scene);
console.log("Meshes:", meshes);
console.log("Skeletons:", skeletons);
console.log("Particle Systems:", particleSystems);

3.2 提供默认值

        如果某个属性可能不存在,可以为它提供一个默认值: 

const { meshes = [], skeletons = [], particleSystems = [] } = await SceneLoader.ImportMeshAsync("", modelPath, "model.glb", scene);
console.log("Meshes:", meshes);
console.log("Skeletons:", skeletons);
console.log("Particle Systems:", particleSystems);

 4. 总结

         解构赋值是 TypeScript 和 JavaScript 中一个非常强大的特性,它能够让代码更加简洁、易读且高效。通过解构赋值,我们可以直接从复杂的数据结构中提取所需的值,而无需通过多层嵌套的访问。在 Babylon.js 的   loadModel   函数中,解构赋值不仅简化了代码,还提高了代码的可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/14550.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Meet DeepSeek] 如何顺畅使用DeepSeek?告别【服务器繁忙,请稍后再试。】

文章目录 [Meet DeepSeek] 如何顺畅使用DeepSeek&#xff1f;告别【服务器繁忙&#xff0c;请稍后再试。】引言使用渠道一&#xff1a;硅基流动 Chatbox AI【推荐】硅基流动 Chatbox AI的优势 使用渠道二&#xff1a;秘塔AI搜索秘塔AI搜索的优势 其它方案1. DeepSeek官网2. 纳…

四模型消融实验!DCS-CNN-BiLSTM-Attention系列四模型多变量时序预测

四模型消融实验&#xff01;DCS-CNN-BiLSTM-Attention系列四模型多变量时序预测 目录 四模型消融实验&#xff01;DCS-CNN-BiLSTM-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于DCS-CNN-BiLSTM-Attention、CNN-BiLSTM-Attention…

索引(MySQL)

1. 没有索引&#xff0c;可能会有什么问题 索引&#xff1a;提高数据库的性能&#xff0c;索引是物美价廉的东西了。不用加内存&#xff0c;不用改程序&#xff0c;不用调sql&#xff0c;只要执行 正确的 create index &#xff0c;查询速度就可能提高成百上千倍。但是天下没有…

Windows 实用设置工具 v3.6.5:一键优化系统设置

这款 Windows 实用设置工具 v3.6.5 是一款功能强大的系统优化软件&#xff0c;由 kernel 开发。它提供了丰富的系统设置选项&#xff0c;帮助用户轻松管理和优化 Windows 系统。以下是该工具的主要功能和特点&#xff1a; 主要功能 隐藏电脑文件夹 视频、文档、图片、音乐、下…

快速上手Vim的使用

Vim Linux编辑器-vim使用命令行模式下所有选项都可以带数字底行模式可视块模式&#xff08;ctrlV进入&#xff09; Linux编辑器-vim使用 Vim有多种模式的编辑器。能帮助我们很快的进行代码的编辑&#xff0c;甚至完成很多其他事情。 默认情况下我们打开vim在命令模式下&#x…

334递增的三元子序列贪心算法(思路解析+源码)

文章目录 题目思路解析源码总结题目 思路解析 有两种解法:解法一:动态规划(利用dp找到数组最长递增序列长度,判断是否大于3即可)本题不适用,因为时间复杂度为O(n^2),超时。 解法二:贪心算法:解法如上图,题目要求长度为三,设置第一个元素为长度1的值,是指长度二的…

sqli-labs靶场实录(二): Advanced Injections

sqli-labs靶场实录: Advanced Injections Less21Less22Less23探测注入点 Less24Less25联合注入使用符号替代 Less25aLess26逻辑符号绕过and/or过滤双写and/or绕过 Less26aLess27Less27aLess28Less28aLess29Less30Less31Less32&#xff08;宽字节注入&#xff09;Less33Less34Le…

Websocket从原理到实战

引言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议&#xff0c;它使得客户端和服务器之间能够进行实时、双向的通信&#xff0c;既然是通信协议一定要从发展历史到协议内容到应用场景最后到实战全方位了解 发展历史 WebSocket 最初是为了解决 HTTP 协议在实时…

Java 大视界 -- Java 大数据在智能供应链中的应用与优化(76)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

使用AI工具(Deepseek or 豆包etc)话业务流程图

①打开AI工具&#xff0c;这里以Deepseek为例子&#xff1a; Deepseek官网 ②输入所要画图的业务流程的文字。 &#xff08;这里以一个用户登录的流程的文字作为例子&#xff09; mermaid在线画图网页&#xff08;根据AI工具对应生成的画图代码&#xff09; ③把AI工具生成的…

Qt+海康虚拟相机的调试

做机器视觉项目的时候&#xff0c;在没有相机或需要把现场采集的图片在本地跑一下做测试时&#xff0c;可以使用海康的虚拟相机调试。以下是设置步骤&#xff1a; 1.安装好海康MVS软件&#xff0c;在菜单栏->工具选择虚拟相机工具&#xff0c;如下图&#xff1a; 2.打开虚拟…

Docker安装Mysql

1.拉取Mysql docker pull mysql:8.3.02.检查成功了没有 docker images mysql:8.3.03.创建先关目录 # conf放配置文件&#xff0c;data放数据&#xff0c;log放日志 mkdir -p /home/mysql/{conf,data,log}4.创建配置文件 vim /home/mysql/conf/my.cnf把这些cv进去&#xff…

OpenCV:图像修复

目录 简述 1. 原理说明 1.1 Navier-Stokes方法&#xff08;INPAINT_NS&#xff09; 1.2 快速行进方法&#xff08;INPAINT_TELEA&#xff09; 2. 实现步骤 2.1 输入图像和掩膜&#xff08;Mask&#xff09; 2.2 调用cv2.inpaint()函数 2.3 完整代码示例 2.4 运行结果 …

数字化转型的三个阶段:信息化、数字化、数智化

在当今快速迭代的数字时代&#xff0c;企业的生存与发展已与数字化转型浪潮紧密相连。数字化转型不仅是对传统业务模式的深度革新&#xff0c;更是企业适应未来市场、提升竞争力的关键路径。这一过程并非一蹴而就&#xff0c;而是循序渐进地分为信息化、数字化、数智化三个阶段…

Spring Boot篇

为什么要用Spring Boot Spring Boot 优点非常多&#xff0c;如&#xff1a; 独立运行 Spring Boot 而且内嵌了各种 servlet 容器&#xff0c;Tomcat、Jetty 等&#xff0c;现在不再需要打成 war 包部署到 容器 中&#xff0c;Spring Boot 只要打成一个可执行的 jar 包就能独…

Python----Python高级(网络编程:网络基础:发展历程,IP地址,MAC地址,域名,端口,子网掩码,网关,URL,DHCP,交换机)

一、网络 早期的计算机程序都是在本机上运行的&#xff0c;数据存储和处理都在同一台机器上完成。随着技术的发展&#xff0c;人 们开始有了让计算机之间相互通信的需求。例如安装在个人计算机上的计算器或记事本应用&#xff0c;其运行环 境仅限于个人计算机内部。这种设置虽然…

JAVA安全—FastJson反序列化利用链跟踪autoType绕过

前言 FastJson这个漏洞我们之前讲过了,今天主要是对它的链条进行分析一下,明白链条的构造原理。 Java安全—log4j日志&FastJson序列化&JNDI注入_log4j漏洞-CSDN博客 漏洞版本 1.2.24及以下没有对序列化的类做校验,导致漏洞产生 1.2.25-1.2.41增加了黑名单限制,…

Kubernetes架构原则和对象设计(三)

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes常见问题解答 本文主要对kubernetes的核心技术概念和核心A…

每日学习 设计模式 五种不同的单例模式

狮子大佬原文 https://blog.csdn.net/weixin_40461281/article/details/135050977 第一种 饿汉式 为什么叫饿汉,指的是"饿" 也就是说对象实例在程序启动时就已经被创建好,不管你是否需要,它都会在类加载时立即实例化,也就是说 实例化是在类加载时候完成的,早早的吃…

Transformer 详解:了解 GPT、BERT 和 T5 背后的模型

目录 什么是 Transformer? Transformer如何工作? Transformer 为何有用? 常见问题解答:机器学习中的 Transformer 在技​​术领域,突破通常来自于修复损坏的东西。制造第一架飞机的人研究过鸟类。莱特兄弟观察了秃鹫如何在气流中保持平衡,意识到稳定性比动力更重要。…