当前位置: 首页 > article >正文

解构赋值在 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   函数中,解构赋值不仅简化了代码,还提高了代码的可维护性。

相关文章:

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

在现代 JavaScript 和 TypeScript 开发中&#xff0c;解构赋值&#xff08;Destructuring Assignment&#xff09;是一种非常实用的特性&#xff0c;它能够让代码更加简洁、易读且高效。今天&#xff0c;我们就通过一个实际的例子——在 Babylon.js 中加载 3D 模型的 loadMod…...

mysql8安装时提示-缺少Microsoft Visual C++ 2019 x64 redistributable

MySQL8.0安装包mysql-8.0.1-winx64进行安装&#xff0c;提示&#xff1a;This application requires Visual Studio 2019 x64Redistributable, Please install the Redistributable then runthis installer again。出现这个错误是因为我们电脑缺少Microsoft Visual C 这个程序&…...

物品匹配问题-25寒假牛客C

登录—专业IT笔试面试备考平台_牛客网 这道题看似是在考察位运算,实则考察的是n个物品,每个物品有ai个,最多能够得到多少个物品的配对.观察题目可以得到,只有100,111,010,001(第一位是ci,第二位是ai,第三位是bi)需要进行操作,其它都是已经满足条件的对,可以假设对其中两个不同…...

学习数据结构(6)单链表OJ上

1.移除链表元素 解法一&#xff1a;&#xff08;我的做法&#xff09;在遍历的同时移除&#xff0c;代码写法比较复杂 解法二&#xff1a;创建新的链表&#xff0c;遍历原链表&#xff0c;将非val的节点尾插到新链表&#xff0c;注意&#xff0c;如果原链表结尾是val节点需要将…...

03/29 使用 海康SDK 对接时使用的 MysqlUtils

前言 最近朋友的需求, 是需要使用 海康sdk 连接海康设备, 进行数据的获取, 比如 进出车辆, 进出人员 这一部分是 资源比较贫瘠时的一个 Mysql 工具类 测试用例 public class MysqlUtils {public static String MYSQL_HOST "192.168.31.9";public static int MY…...

全志A133 android10 thermal温控策略配置调试

一&#xff0c;功能介绍 Thermal简称热控制系统&#xff0c;其功能是通过temperature sensor&#xff08;温度传感器&#xff09;测量当前CPU、GPU等设备的温度值&#xff0c;然后根据此温度值&#xff0c;影响CPU、GPU等设备的调频策略&#xff0c;对CPU、GPU等设备的最大频率…...

知识图谱智能应用系统:数据存储架构与流程解析

在当今数字化时代,知识图谱作为一种强大的知识表示和管理工具,正逐渐成为企业、科研机构以及各类智能应用的核心技术。知识图谱通过将数据转化为结构化的知识网络,不仅能够高效地存储和管理海量信息,还能通过复杂的查询和推理,为用户提供深度的知识洞察。然而,构建一个高…...

mac下生成.icns图标

笔记原因&#xff1a; 今日需要在mac下开发涉及图标文件的使用及icons文件的生成&#xff0c;所以记录一下。 网络上都是一堆命令行需要打印太麻烦了&#xff0c;写一个一键脚本。 步骤一 将需要生成的png格式文件重命名为“pic.png” mv xxxx.png pic.png 步骤二 下载我…...

Dev-cpp C语言编写和调用dll

Dev-cpp新建DLL项目。 dllmain.cpp #include "dll.h" #include <windows.h>int add(int a, int b) { return a b; } dll.h #ifndef _DLL_H_ #define _DLL_H_extern "C" __declspec(dllexport) int add(int a, int b);#endif 调用DLL&#…...

IDEA编写SpringBoot项目时使用Lombok报错“找不到符号”的原因和解决

目录 概述|背景 报错解析 解决方法 IDEA配置解决 Pom配置插件解决 概述|背景 报错发生背景&#xff1a;在SpringBoot项目中引入Lombok依赖并使用后出现"找不到符号"的问题。 本文讨论在上述背景下发生的报错原因和解决办法&#xff0c;如果仅为了解决BUG不论原…...

差速驱动机器人MPC算法实现-C++

差速驱动机器人&#xff0c;其运动学模型需要考虑线速度和角速度。MPC&#xff08;模型预测控制&#xff09;需要建立预测模型&#xff0c;并在每个控制周期内求解优化问题。 差速驱动机器人的运动学方程通常包括位置&#xff08;x, y&#xff09;和航向角θ&#xff0c;线速度…...

将仓库A分支同步到仓库B分支,并且同步commit提交

一、 问题 有一仓库A 和 一仓库B&#xff0c; 需要将仓库A分支a1所有提交同步推送到仓库B分支b1上 二、 解决 2.1、 首先需要仓库A、仓库B的权限&#xff0c; 2.2、将仓库A clone到本地&#xff0c; 进入A目录&#xff0c;并且切换到a1分支 cd A ## A 为A仓库clone到本地代…...

kafka生产者之发送模式与ACK

文章目录 Kafka的发送模式Kafka的ack机制发送模式与ack的关联重试次数总结 在Kafka中&#xff0c;发送模式与ack机制紧密相关&#xff0c;它们共同影响着消息发送的可靠性和性能。 Kafka的发送模式 发后即忘&#xff08;Fire and Forget&#xff09;&#xff1a;生产者发送消息…...

C++字符串相关内容

字符串 字符串&#xff0c;本质上是一个接一个字符的一组字符。字母、数字、符号等。 const char* 字符串名 字符后面会有一个空终止符&#xff0c;为0。 字符串从指针的内存地址开始&#xff0c;然后继续下去&#xff0c;直到它碰到0&#xff0c;然后意识到字符串终止了。 …...

Windows Docker笔记-Docker拉取镜像

通过在前面的章节《安装docker》中&#xff0c;了解并安装成功了Docker&#xff0c;本章讲述如何使用Docker拉取镜像。 使用Docker&#xff0c;主要是想要创建并运行Docker容器&#xff0c;而容器又要根据Docker镜像来创建&#xff0c;那么首当其冲&#xff0c;必须要先有一个…...

穷举vs暴搜vs深搜vs回溯vs剪枝系列一>黄金矿工

目录 决策树&#xff1a;代码设计代码&#xff1a; 决策树&#xff1a; 代码设计 代码&#xff1a; class Solution {boolean[][] vis;int ret,m,n;public int getMaximumGold(int[][] grid) {m grid.length;n grid[0].length;vis new boolean[m][n]; for(int i 0; i <…...

07苍穹外卖之redis缓存商品、购物车(redis案例缓存实现)

课程内容 缓存菜品 缓存套餐 添加购物车 查看购物车 清空购物车 功能实现&#xff1a;缓存商品、购物车 效果图&#xff1a; 1. 缓存菜品 1.1 问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压…...

使用DeepSeek的技巧笔记

来源&#xff1a;新年逼自己一把&#xff0c;学会使用DeepSeek R1_哔哩哔哩_bilibili 前言 对于DeepSeek而言&#xff0c;我们不再需要那么多的提示词技巧&#xff0c;但还是要有两个注意点&#xff1a;你需要理解大语言模型的工作原理与局限,这能帮助你更好的知道AI可完成任务…...

Unity-Mirror网络框架-从入门到精通之CouchCoop示例

文章目录 前言示例NetworkManagerCouchPlayerManagerCouchPlayerPlatformMovementMovingPlatformCameraViewForAllCanvasScript前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多…...

Spring Boot Web 入门

目录 Spring Boot Web 是 Spring Boot 框架的一个重要模块&#xff0c;它简化了基于 Spring 的 Web 应用程序的开发过程。以下是一个 Spring Boot Web 项目的入门指南&#xff0c;涵盖了项目创建、代码编写、运行等关键步骤。 1. 项目创建 使用 Spring Initializr 使用 IDE …...

C++ 顺序表

顺序表的操作有以下&#xff1a; 1 顺序表的元素插入 给定一个索引和元素&#xff0c;这个位置往后的元素位置都要往后移动一次&#xff0c;元素插入的步骤有以下几步 &#xff08;1&#xff09;判断插入的位置是否合法&#xff0c;如果不合法则抛出异常 &#xff08;2&…...

SQL-leetcode—1327. 列出指定时间段内所有的下单产品

1327. 列出指定时间段内所有的下单产品 表: Products ------------------------- | Column Name | Type | ------------------------- | product_id | int | | product_name | varchar | | product_category | varchar | ------------------------- product_id 是该表主键(具…...

DeepSeek图解10页PDF

以前一直在关注国内外的一些AI工具&#xff0c;包括文本型、图像类的一些AI实践&#xff0c;最近DeepSeek突然爆火&#xff0c;从互联网收集一些资料与大家一起分享学习。 本章节分享的文件为网上流传的DeepSeek图解10页PDF&#xff0c;免费附件链接给出。 1 本地 1 本地部…...

机器学习中常用的评价指标

一、分类任务常用指标 1. 准确率&#xff08;Accuracy&#xff09; 定义&#xff1a;正确预测样本数占总样本数的比例。优点&#xff1a;直观易懂&#xff0c;适用于类别平衡的数据。缺点&#xff1a;对类别不平衡数据敏感&#xff08;如欺诈检测中99%的负样本&#xff09;。…...

3. 【.NET Aspire 从入门到实战】--理论入门与环境搭建--环境搭建

构建现代云原生应用程序时&#xff0c;开发环境的搭建至关重要。NET Aspire 作为一款专为云原生应用设计的开发框架&#xff0c;提供了一整套工具、模板和集成包&#xff0c;旨在简化分布式系统的构建和管理。开始项目初始化之前&#xff0c;确保开发环境的正确配置是成功的第一…...

【Golang学习之旅】Go + MySQL 数据库操作详解

文章目录 前言1. GORM简介2. 安装GORM并连接MySQL2.1 安装GORM和MySQL驱动2.2 连接MySQL 3. GORM数据模型&#xff08;Model&#xff09;3.1 定义User结构体3.2 自动迁移&#xff08;AutoMigrate&#xff09; 4. GORM CRUD 操作4.1 插入数据&#xff08;Create&#xff09;4.2 …...

33.日常算法

1.螺旋矩阵 题目来源 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] class Solution { public:vec…...

ArgoCD实战指南:GitOps驱动下的Kubernetes自动化部署与Helm/Kustomize集成

摘要 ArgoCD 是一种 GitOps 持续交付工具,专为 Kubernetes 设计。它能够自动同步 Git 仓库中的声明性配置,并将其应用到 Kubernetes 集群中。本文将介绍 ArgoCD 的架构、安装步骤,以及如何结合 Helm 和 Kustomize 进行 Kubernetes 自动化部署。 引言 为什么选择 ArgoCD?…...

每日Attention学习22——Inverted Residual RWKV

模块出处 [arXiv 25] [link] [code] RWKV-UNet: Improving UNet with Long-Range Cooperation for Effective Medical Image Segmentation 模块名称 Inverted Residual RWKV (IR-RWKV) 模块作用 用于vision的RWKV结构 模块结构 模块代码 注&#xff1a;cpp扩展请参考作者原…...

机器学习之数学基础:线性代数、微积分、概率论 | PyTorch 深度学习实战

前一篇文章&#xff0c;使用线性回归模型逼近目标模型 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于 强化学习必修课&#xff1a;引领人工智能新时代【梗直哥瞿炜】 线性代数、微积分、概率论 …...