Функция Typescript для генерации класса, реализующего интерфейс - PullRequest
0 голосов
/ 30 сентября 2019

У меня вопрос к вопросу, который я не понимаю в механизме машинописи: почему в следующем коде ComposerA верен, а ComposerB нет?

type Ctor<T = {}> = new (...args: any[]) => T;

function ComposerA<T extends Ctor>(Target: T) {
  return class extends Target {
    ...
  }
}

function ComposerB<T extends Ctor>(Target: T) {
  return class implements Target {
    ...
  }
}

В ComposerB я получаю ошибку -> «Цель» относится к значению, но здесь используется как тип.

Я думаю, что есть концепция, которую я не понял. Можно ли реализовать функцию, которая берет объект и реализует его. Мне нужны реализации, а не расширения, этот пример является упрощением моего исходного кода, и у меня уже есть расширение другого класса.

1 Ответ

0 голосов
/ 30 сентября 2019

Вы не можете implement ничего во время выполнения, но вы можете добавить методы к прототипу класса и изменить сигнатуру конструктора с помощью обобщений:

type Class<T={}> = new (...args: any) => T;

interface Fooable {
    foo(n: number):string
}

function withFoo<T>(k: Class<T>): Class<T & Fooable> {

    k.prototype.foo = function(n: number): string {
        return "foo";
    }

    return k as Class<T & Fooable>;
}

class Blah {
    blah(s: string) {}    
}

let BlahFooable = withFoo(Blah);

let b = new BlahFooable;

b.blah("hey") // ok
b.foo(42) // ok

Воспроизвести

В более общем виде:

type Class<T={}> = new (...args: any) => T;

function Mixin<T, M extends object>(cls: Class<T>, mixin: M): Class<T & M> {
    Object.assign(cls.prototype, mixin);
    return cls as Class<T & M>;
} 

class Blah {
    blah(s: string) {}
}

let BlahWithFoo = Mixin(Blah, {
    foo(n: number): string {
        return "foo";
    }
});

let b = new BlahWithFoo();

b.blah("hey") // ok
b.foo(42) // ok
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...