代码之家  ›  专栏  ›  技术社区  ›  atconway

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

  •  0
  • atconway  · 技术社区  · 5 年前

    查看TypeScript文档并尝试 Intersection Types Mixins 用打字机 types , Interfaces ,或 Classes

    这是用来申请的 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;
    }
    

    除了事实上 混入 方法接受一个数组,并且 交叉口类型 方法具体取2个值,它们最终从行为的角度表现相同。如果我有 Person User 交叉口类型 mixin 用户 .

    讽刺的是,这正是我想要的,但我觉得我错过了一个目标 What's the difference between mixin() and extend() in Javascript libraries extend 在这种情况下与 交叉口类型 在TypeScript中(即使helper方法就是这样调用的)。

    看看这两个助手方法 出现

    0 回复  |  直到 5 年前
        1
  •  2
  •   Andrea Alhena    5 年前

    混音 用于更改类定义,添加由其他对象提供的功能。它们在prorotype上工作,因此效果是针对所有实例执行的,这两个实例都已生成

    交叉口 是为了扩展 一个给定的实例 不改变原来的。实际上,返回的对象是一个全新的实例

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