对象传播广泛用于更新功能样式中的旧对象,如下所示:
let o1 = { x: 5, y: 6 };
let o2 = { ...o1, y: 10 };
alert(JSON.stringify(o2));
Run Code Online (Sandbox Code Playgroud)
在新的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));
Run Code Online (Sandbox Code Playgroud)
所以,这里有一个问题:如何安全地键入TypeScript中的对象传播来更新对象?或者更一般的问题:如何在TypeScript 2.1中以函数(不可变)和类型安全的方式更新对象?
对象扩展允许用现有密钥或新密钥扩展基础对象.与Object.assign相同.这是JS的动态本质.
如果这不是你想要的(通常是我的情况),那么不要使用Object spread或assign.
你可以在本地写一个实用程序函数,如下所示:
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
}
Run Code Online (Sandbox Code Playgroud)
我认为它有你想要的语义.
| 归档时间: |
|
| 查看次数: |
839 次 |
| 最近记录: |