【问题标题】:Destructuring nullable objects解构可为空的对象
【发布时间】:2017-12-25 21:06:14
【问题描述】:

Typescript(或者我们应该说 ES)不允许对空/未定义对象进行解构。它会抛出 TypeError。

所以,假设我们有类似的东西

let {a,b,c} = D;

其中D 可能是null

如果我们需要使用空检查进行条件解构赋值,那么我们会为一些旨在减少它的东西创建样板代码。

在这种情况下最优雅的使用方式是什么,或者我们应该只对有保证的非空对象使用解构?

【问题讨论】:

  • Typescript 在这方面做得很好。而不是绕过类型系统,你应该接受它的目标,其中包括:了解你的类型。
  • 你能说得更清楚一点吗?一些例子?类型系统与这个特定问题有什么关系? (我熟悉静态类型)
  • 使用静态类型系统,您应该知道所有变量的类型。变量的类型在运行时不得更改。我不知道 Typescript 的类型系统有多花哨,但至少你应该知道 Dnull 还是 Object 类型。
  • 等待等待...但是 Object 可以为空。然后呢?

标签: typescript object ecmascript-6


【解决方案1】:

您可以使用空对象作为备用对象,如果 Dnullundefined,则分配的变量将为 undefined

const D = null;
const { a, b, c } = D || {};

console.log(a, b, c);

使用打字稿,您需要将正确的类型(或any)添加到 FALLBACK 对象(TS playground)。例如:

interface Obj {
    a?: string;
    b?: string;
    c?: string;
}

const D = null;
const { a, b, c } = D || {} as Obj;

console.log(a, b, c);

另一种选择是使用object spread,因为传播nullundefined 会导致一个空对象(see this SO answer)。

const D = null;
const { a, b, c } = { ...D };

console.log(a, b, c);

使用打字稿,您需要将类型添加到您传播的变量和您解构的对象中。例如(TS Playground):

interface Obj {
    a?: string;
    b?: string;
    c?: string;
}

const D = null;
const { a, b, c } = { ...D as any } as Obj;

console.log(a, b, c);

如果需要处理嵌套解构,请使用默认值:

const D = null;
const { a, a: { z } = {}, b, c } = { ...D };

console.log(a, b, c, z);

【讨论】:

  • 关于如何在子对象中做好这件事的任何想法?例如:``` let a = { b: null };让 { b: { c } } = a; // 未捕获的 SyntaxError: 无效的解构赋值目标 ```
  • 嵌套重组怎么样?例如const { z: { b } } = a; 在这种情况下,z 未定义
  • 这些选项不适用于 TypeScript。
  • 自发布此答案以来,我不知道 Typescript 中有关严格类型检查的内容是否发生了变化,但正如 @Organic 提到的,这些解决方案目前在 Typescript 中不起作用。当我尝试像 const { a, b, c } = D || {}; 这样解构一个空对象时,我收到一个错误 Property 'a' does not exist on type '{}'
  • @Dado - 只要您添加正确的类型,这两个选项都适用于 TS。我添加了 TS + 到 TS Playground 的链接的示例。
猜你喜欢
  • 2021-12-29
  • 2018-12-31
  • 2020-09-08
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 2021-02-14
相关资源
最近更新 更多