解构可为空的对象

Posted

技术标签:

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

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

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

let a,b,c = D;

其中D 可能是null

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

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

【问题讨论】:

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

以上是关于解构可为空的对象的主要内容,如果未能解决你的问题,请参考以下文章

可为空的对象必须具有一个值 是啥原因啊 求解 谢谢

EfCore OwnsOne 种子可为空的对象失败

如何从数据库中获取可为空的 DateTime

在 Typescript 中将可为空的对象值转换为字符串

将可为空的 int 映射到可为空的 int + automapper

堆栈溢出错误可为空的数字类型c#