通过扩展对象文字

时间:2015-07-06 20:12:26

标签: javascript typescript underscore.js lodash

假设我有两个接口,我想用它来构造一个实例。其中一个接口扩展了另一个接口。

interface IScope {/*... */}

interface IDialogScope extends IScope { a? : string , b? : string }

假设在第三方模块中有一个方法让我实例化一个IScope类型的变量

var scope : IDialogScope = ScopeBuilder.build(); /* build actually returns an IScope type */

现在我可以填充范围变量

scope.a = "hello"; scope.b = "world";

如果我使用lodash / underscore,我可以用我的自定义属性扩展现有的对象文字并获得我的最终对象。这里TypeScript的问题是我不能只创建一个实现IDialogScope的DialogScope类,因为那时我还必须在IScope中实现我无法实现的所有内容,因为它来自第三方库。

我希望能够在TypeScript中执行此操作:

var scope : IDialogScope = _.extend({}, ScopeBuilder.build(), {a: "hello", b: "world"});

1 个答案:

答案 0 :(得分:3)

  

我希望能够在TypeScript中执行此操作:

这正是交集类型的用途。

function extend<T, U>(first: T, second: U): T & U {
    let result = <T & U> {};
    for (let id in first) {
        result[id] = first[id];
    }
    for (let id in second) {
        if (!result.hasOwnProperty(id)) {
            result[id] = second[id];
        }
    }
    return result;
}

var x = extend({ a: "hello" }, { b: 42 });
var s = x.a;
var n = x.b;

这些最近才发布:https://github.com/Microsoft/TypeScript/pull/3622

它将成为TypeScript 1.6的一部分。

如果您今天要使用它,可以使用ntypescripthttps://github.com/basarat/ntypescript