解构可为空的对象
Posted
技术标签:
【中文标题】解构可为空的对象【英文标题】:Destructuring nullable objects 【发布时间】:2017-12-25 21:06:14 【问题描述】:Typescript(或者我们应该说 ES)不允许对空/未定义对象进行解构。它会抛出 TypeError。
所以,假设我们有类似的东西
let a,b,c = D;
其中D
可能是null
。
如果我们需要使用空检查进行条件解构赋值,那么我们会为一些旨在减少它的东西创建样板代码。
在这种情况下最优雅的使用方式是什么,或者我们应该只对有保证的非空对象使用解构?
【问题讨论】:
Typescript 在这方面做得很好。而不是绕过类型系统,你应该接受它的目标,其中包括:了解你的类型。 你能说得更清楚一点吗?一些例子?类型系统与这个特定问题有什么关系? (我熟悉静态类型) 使用静态类型系统,您应该知道所有变量的类型。变量的类型在运行时不得更改。我不知道 Typescript 的类型系统有多花哨,但至少你应该知道D
是 null
还是 Object
类型。
等待等待...但是 Object 可以为空。然后呢?
【参考方案1】:
您可以使用空对象作为备用对象,如果 D
是 null
或 undefined
,则分配的变量将为 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,因为传播null
或undefined
会导致一个空对象(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 的链接的示例。以上是关于解构可为空的对象的主要内容,如果未能解决你的问题,请参考以下文章