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

举报
汪子熙 发表于 2023/09/09 09:17:13 2023/09/09
【摘要】 笔者最近一直在 SAP 中国研究院从事 Angular 开发,我所在的团队负责使用 Angular 开发 SAP Commerce Cloud 这款产品的界面,项目代号为 Spartacus.这是一个开源项目,我们项目的 Github 地址如下。最近我处理了一个 bug,我的代码改动放在这个 Pull Request里。下面是这个 Pull Request 里包含的代码改动,可以看到我使用了...

笔者最近一直在 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 开发中经常用于组件通信、函数调用和参数传递的场景,能够增加代码的灵活性和可读性。它的使用有助于简化函数调用、数组合并等操作,提高代码的可维护性和可扩展性。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。