打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
关于 TypeScript 展开运算符在 Angular 应用开发中的应用一例
userphoto

2023.09.08 四川

关注

笔者最近一直在 SAP 中国研究院从事 Angular 开发,我所在的团队负责使用 Angular 开发 SAP Commerce Cloud 这款产品的界面,项目代号为 Spartacus.

这是一个开源项目,我们项目的 Github 地址如下

最近我处理了一个 bug,我的代码改动放在这个 Pull Request里。

下面是这个 Pull Request 里包含的代码改动,可以看到我使用了 TypeScript 的展开运算符(三个句点):

代码里使用的 stringifyWithContext 方法,接收一个字符串类型的变量和一个 Context 对象作为输入参数,返回一个序列化之后的 JSON 字符串。这个输出的 JSON 字符串可以写入 kibana 等 Trace 工具内。

protected stringifyWithContext(
 message: string,
 context: ExpressServerLoggerContext
  ): string {
 const logObject = { message, context: this.mapContext(context) };

 return isDevMode()
   ? JSON.stringify(logObject, null, 2)
   : JSON.stringify(logObject);
  }

而 transform 方法的输出是一个数组。为了把数组里的元素依次展开成 String 和 Context 对象,故我们对该数组使用展开运算符。

实际上,在 Angular 技术领域,特别是在处理组件通信、数据传递以及函数参数展开方面,展开运算符(Spread Operator)是一种重要的语法特性。该运算符主要用于将数组、对象或者函数参数在特定的上下文中进行展开,以实现更灵活的数据传递和函数调用。

笔者利用修复这个 bug 的机会,系统地学习了 TypeScript 里展开运算符的使用方式。

在上面我提供的代码中,涉及到展开运算符的地方是:

...this.transform(message, context, this._transformers, this)

这行代码使用展开运算符将函数 this.transform() 的返回值展开作为参数传递给 this.stringifyWithContext() 函数。

展开运算符的基本概念

展开运算符 ... 允许将一个可迭代对象(比如数组、字符串或类数组对象等)拆分成独立的元素,或者将多个元素合并为一个数组或对象。这种特性在函数调用时尤其有用,可以将数组或对象的元素分散为函数的参数。

数组展开

const arr = [1, 2, 3];
console.log(...arr); // 输出:1 2 3

函数参数展开

function add(a, b, c) {
  return a + b + c;
}

const values = [1, 2, 3];
console.log(add(...values)); // 输出:6

展开运算符在提供的代码中的应用

回到我修复 bug 的上下文代码:

  1. this.transform(message, context, this._transformers, this):这是一个函数调用,返回一个数组或可迭代对象,其中包含了要传递给 this.stringifyWithContext() 函数的参数。

  2. ...this.transform(message, context, this._transformers, this):在这里,展开运算符 ... 将函数调用的结果拆分成独立的参数,以便将它们传递给 this.stringifyWithContext() 函数。

  3. this.stringifyWithContext(...):现在,拆分的参数会作为独立的值传递给 this.stringifyWithContext() 函数,使得函数能够正确接收和处理这些参数。

示例

为了更好地理解,我们来看一个示例,假设有如下的函数:

function concatenateStrings(...args) {
  return args.join(' ');
}

const strings = ['Hello', 'world', 'from', 'Angular'];
const result = concatenateStrings(...strings);
console.log(result); // 输出:Hello world from Angular

在这个示例中,concatenateStrings() 函数使用展开运算符将传入的字符串数组展开为独立的参数,然后将它们连接起来并返回结果。

剩余运算符

注意,在 TypeScript 代码中,剩余运算符(Rest Operator)也用 ... 表示,但它的使用场景是在函数参数、数组解构和对象解构中,代表剩余的元素。

看一个剩余运算符用在函数参数中的例子:

function sum(...nums: number[]): number {
  return nums.reduce((a, b) => a + b, 0);
}

console.log(sum(1, 2, 3, 4, 5));  // 输出 15

在这个例子中,...nums 表示 sum 函数可以接受任意数量的参数,并将它们作为一个数组处理。

数组解构的例子:

let arr = [1, 2, 3, 4, 5];
let [first, ...rest] = arr;
console.log(first);  // 输出 1
console.log(rest);   // 输出 [2, 3, 4, 5]

在这个例子中,...rest 表示除了第一个元素之外的所有元素。

对象解构的例子:

let obj = { a: 1, b: 2, c: 3, d: 4 };
let { a, ...rest } = obj;
console.log(a);  // 输出 1
console.log(rest);  // 输出 { b: 2, c: 3, d: 4 }

在这个例子中,...rest 表示除了属性 a 之外的所有属性。

总结

展开运算符在 Angular 开发中经常用于组件通信、函数调用和参数传递的场景,能够增加代码的灵活性和可读性。它的使用有助于简化函数调用、数组合并等操作,提高代码的可维护性和可扩展性。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
《Angular项目实战》02 智慧工厂主界面写字字帖
最简单的C#快速入门教程
javascript ES6语法糖:函数…省略号参数 | 扣丁禅师
25个最基本的JavaScript面试问题及答案
AngularJS学习笔记
C#基础到入门(一篇就够了)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服