TypeScript中的mixin和交集类型有什么区别?

时间:2019-04-12 04:39:52

标签: typescript

查看TypeScript文档,并使用提供的实用程序方法在TypeScript中尝试Intersection TypesMixins 的示例,我发现两者的行为和结果基本相同方法论。我最后得到的对象最终是1..n个其他typesInterfacesClasses的组合。这是我在编码示例中使用的方法,这些方法在TypeScript文档中是完全正确的。

这用于在TypeScript中应用mixins

function applyMixins(derivedCtor: any, baseCtors: any[]) {
    baseCtors.forEach(baseCtor => {
        Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {
            Object.defineProperty(derivedCtor.prototype, name, Object.getOwnPropertyDescriptor(baseCtor.prototype, name));
        });
    });
}

这是我用于intersection type的内容:

function extend<First, Second>(first: First, second: Second): First & Second {
    const result: Partial<First & Second> = {};
    for (const prop in first) {
        if (first.hasOwnProperty(prop)) {
            (<First>result)[prop] = first[prop];
        }
    }
    for (const prop in second) {
        if (second.hasOwnProperty(prop)) {
            (<Second>result)[prop] = second[prop];
        }
    }
    return <First & Second>result;
}

除了mixins方法采用一个数组,而intersection type方法专门采用两个值这一事实之外,从行为的角度来看,它们最终的行为相同。如果我有一个PersonUser类,分别具有各自的属性和方法,则在使用上述任何一种方法之后,我都可以根据intersection type定义的类型创建新实例或mixin,然后查看PersonUser的所有组合。

具有讽刺意味的是,这正是我想要的,但是我觉得我错过了何时使用这两种方法的目的。我做了一些挖掘,发现这篇文章与JavaScript( What's the difference between mixin() and extend() in Javascript libraries),但是我不确定extend在这种情况下是否与TypeScript中的intersection type相同(即使helper方法只是这样)。

查看它们出现的两种辅助方法,以完全按照需要将A的属性复制或定义为B。有人可以解释一下TypeScript中的两种方法之间的区别,以及为什么要使用一种方法替代另一种方法吗?

1 个答案:

答案 0 :(得分:1)

我会尽力给我两美分。

Mixins 旨在更改类定义,增加其他对象提供的功能。它们可以处理原型,因此可以对所有已经将来的实例执行效果。

交叉点旨在扩展一个给定实例的属性,而无需更改原始实例。实际上,返回的对象是一个全新的实例

const result: Partial<First & Second> = {};

所以我认为差异很大。如果不使用原型,给出的只是一个一次性实例。同一类的实例将不受更改的影响,因为这些都不会反映在类原型中。