首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在TypeScript中安全地使用对象扩展来更新不可变对象

如何在TypeScript中安全地使用对象扩展来更新不可变对象
EN

Stack Overflow用户
提问于 2016-12-15 07:33:35
回答 1查看 1.8K关注 0票数 6

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

代码语言:javascript
复制
let o1 = { x: 5, y: 6 };
let o2 = { ...o1, y: 10 };
alert(JSON.stringify(o2));

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

代码语言:javascript
复制
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中更新函数(不可变)中的对象和类型安全的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-15 08:03:41

对象扩展允许使用现有的或新的键扩展基对象。Object.assign也是如此。这是JS的动态本性。

如果这不是您想要的(我经常是这样的),那么不要使用对象扩展或赋值。

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

代码语言:javascript
复制
function update<T, K extends keyof T>(obj: T, updateSpec: Pick<T, K>): T {
  const result = {} as T
  Object.keys(obj).forEach(key => result[key] = obj[key])
  Object.keys(updateSpec).forEach((key: K) => result[key] = updateSpec[key])
  return result
}

我觉得它有你想要的语义。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41158707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档