如何在TypeScript中安全地使用对象传播来更新不可变对象

时间:2016-12-15 07:33:35

标签: typescript

对象传播广泛用于更新功能样式的旧对象,如下所示:

let o1 = { x: 5, y: 6 };
let o2 = { ...o1, y: 10 };
alert(JSON.stringify(o2));

在新的TypeScript 2.1中,我们现在实现了对象扩展,但与简单对象文字不同,它允许具有未知属性:

interface Point { x: number, y: number }

let o1: Point = { x: 5, y: 6 };

//ERROR: Object literal may only specify known properties
let o2: Point = { x: 5, y: 6, z: 10 };

// OK: had I wanted to update y, but misspeled it,  
// I would get new "z" prop instead of compiler error which I would prefer to have:
let o3: Point = { ...o1, z: 10 }; 

alert(JSON.stringify(o3));

所以,这里有一个问题:如何安全地键入TypeScript中的对象传播来更新对象?或者更一般的问题:如何在TypeScript 2.1中以函数(不可变)和类型安全的方式更新对象?

1 个答案:

答案 0 :(得分:7)

对象传播允许用现有密钥或新密钥扩展基础对象。与Object.assign相同。它具有JS的动态性。

如果那不是您想要的(通常是我的情况)那么请不要使用对象传播或分配。

您可以在本地编写实用程序函数,如下所示:

class is too large

我认为它有你想要的语义。