Динамическое наследование TypeScript - PullRequest
0 голосов
/ 11 июня 2018

JavaScript разрешает динамическое наследование.Мне было интересно, если TypeScript принять это во внимание.Следующий код может проиллюстрировать проблему.

// inheritance.js
function fn1() {
  this.a = "fn1";
}

function fn2() {
  // ...
}

let f1 = new fn1(); // "instance" of fn1
let f2 = new fn2(); // "instance" of fn2

// inheritance
f2.__proto__ = f1;

// f2.a inherits from f1
console.log(f2.a); // output: "fn1"

Как вы можете видеть, мы добавляем объект f1, который является экземпляром fn1, в цепочку прототипов f2.Поэтому мой вопрос заключается в следующем: можем ли мы воспроизвести это поведение в TypeScript с помощью классов?Как бы изменить следующий код, чтобы получить ожидаемый результат?

// inheritance.ts
class class1 {
  public a: string = "class1";
}

class class2 extends class1 {
  // ...
}

let c1 = new class1();
let c2 = new class2();

console.log(c1.a); // output: "class1"

// this line would not work
c2.__proto__ = c1;

// change value c1.a
c1.a = "dynamical inheritance test";

console.log(c2.a); // should print value of c1.a (i.e "dynamical inheritance test")

1 Ответ

0 голосов
/ 11 июня 2018

Я думаю, что вы ищете что-то вроде смешивания пересечения.Простой пример можно найти в машинописной документации .Чтобы сделать то, что вы хотите, вы можете просто присвоить результирующий класс микширования наследующему классу, а затем скопировать все свойства класса, который вы хотите расширить до результата:

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

class Class1 {
    public a: string;
    constructor(n: string) {
        this.a = n;
    }
}

class Class2 {
    b: string = 'bbb';
}

const a = new Class1("bar");
const b = extendDynamic(a, new Class2());
a.a = 'foo';
console.log(b.a, b.b); // foo, bbb
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...