typescript - 如何在 Typescript 中扩展匿名类型

标签 typescript intellisense strong-typing

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/

相关文章:

xcode - 智能感知在 XCode 中工作吗?

c# - 如何从 IntelliSense 隐藏公共(public)方法

c# - C# 是强类型语言还是弱类型语言?

javascript - 为什么使用粗箭头而不是直接赋值?

oop - 如何使用接口(interface)获取对象的子集?

javascript - 使用 Angular 4 Form Group 编辑和添加新数据

PHP 'instanceof' 类常量失败

typescript - Jest 模拟节点模块不适用于 typescript

jquery - JQuery 1.4 的 Visual Studio 自动完成功能在哪里?

python - 显式类型的 Python 版本?