在 typescript
中链接功能时使用匿名类型,例如这样:
let array = [{ seed: 2 }, { seed: 3 }];
array
.map(i => ({ seed: i.seed, square: i.seed * i.seed }))
.forEach(i => console.log(`square for ${i.seed} is ${i.square}`));
我需要为 map 函数定义新的匿名类型。如果我有多个步骤来生成新属性,我最终会编写大量定义代码来保留所有属性。
我可以用
$.extend
(或 Object.assign
),但那样我将失去智能感知和强输入。 array
.map(i => $.extend(i, { square: i.seed * i.seed }))
.forEach(i => console.log(`square for ${i.seed} is ${i.square}`));
如何在保持强类型的同时扩展匿名对象而无需再次定义所有属性?
最佳答案
我终于找到了解决办法。这可以通过 Intersection Types 实现.这些可以与匿名类型和类一起使用。在下面的示例中,扩展函数将从每个对象复制属性并返回一个交集类型的对象。这将减少大量的类型定义代码,而不会丢失智能感知和强类型。
function extend<T, U>(first: T, second: U): T & U {
let result = <T & U>{};
for (let id in first) {
(<any>result)[id] = (<any>first)[id];
}
for (let id in second) {
if (!result.hasOwnProperty(id)) {
(<any>result)[id] = (<any>second)[id];
}
}
return result;
}
let array = [{ seed: 2 }, { seed: 3 }];
array
.map(i => extend(i, { square: i.seed * i.seed }))
.map(i => extend(i, { cube: i.square * i.seed }))
.forEach(i => console.log(`square for ${i.seed} is ${i.square} and cube is ${i.cube}`));
同样在 Playground
这是实现的 f.e.在 core-js和它的 type definitions返回路口类型:
assign<T, U>(target: T, source: U): T & U;
关于typescript - 如何在 Typescript 中扩展匿名类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36572053/