打字稿:花括号作为函数参数

geo*_*-un 7 typescript angular

在检查Alfresco ADF的内容元数据组件时,我偶然发现了以下打字稿功能,但我无法理解它:

private saveNode({ changed: nodeBody }): Observable<Node> {
  return this.nodesApiService.updateNode(this.node.id, nodeBody);
}
Run Code Online (Sandbox Code Playgroud)

我不明白的是{ changed: nodeBody }.

根据这个这个答案,大括号用于表示对象文字,作为使用键/值对作为函数参数的一种方式。但在这里它被用作参数。如果这创建了一个对象,在我的理解中,这意味着它changed是其属性的名称,并nodeBody指的是属性值。但是这个对象分配给了哪个变量,如何在方法体中引用它?

更让我困惑的是,只有nodeBody在 return 语句中使用。那么为什么不立即将其用作单个参数呢?

这种输入形式的好处或用例是什么?

bug*_*ugs 6

你的理解是正确的。

在我看来,使用这种方法有两个主要好处,第一个是通过指定函数只能接受特定形状的参数来获得明显的类型安全性。

function f({ a: b }) {
  return b;
}

f({a: 1}) // -> 1
f({c: 1}) // type error
Run Code Online (Sandbox Code Playgroud)

第二件事是不必在函数体中显式键入a.b(在您的情况下)多种类型的便利。changed.nodeBody在您的示例中,您仅在 return 语句中使用nodeBody一次,但您可以轻松想象该值被多次使用的情况。

但是这个对象被分配给哪个变量以及如何在方法体中引用它呢?

在您的示例中,您可以简单地nodeBody在函数体中使用来引用changed参数对象的键的值。