Как набрать функцию машинописи, которая имеет Mixin в качестве типа param? - PullRequest
0 голосов
/ 19 декабря 2018

Скажем, у меня есть:

class Person {
    constructor(public name: string) {}
}

type Constructor<T> = new(...args: any[]) => T;

function Tagged<T extends Constructor<{}>>(Base: T) {
    return class extends Base {
        _tag: string;
        constructor(...args: any[]) {
            super(...args);
            this._tag = "";
        }
    }
}

Я хочу иметь функцию, которая принимает экземпляры класса, созданного Tagged, в качестве параметра.Например:

function printTag(taggedObj: Tagged(Person)) {
       console.log(taggedObj._tag);
}

Как правильно набрать это, сейчас это дает мне ошибку компиляции?Нужно ли создавать другой класс?Как:

class TaggedPoint extends Tagged(Person) {}


Следующий вопрос: если я создам

function printTag(taggedObj: TaggedPoint) {
       console.log(taggedObj._tag);
}

А затем в другом месте у меня будет

class OtherTaggedPoint extends Tagged(Person) {
    constructor(tag) {
        super(‘some string’);
    }
}
printTag(new OtherTaggedPoint()); 

Будетэто вызывает ошибку компиляции, потому что TaggedPoint не совпадает с OtherTaggedPoint?

1 Ответ

0 голосов
/ 20 декабря 2018

Сначала я бы предоставил именованный интерфейс для того, что обеспечивает микширование:

interface Tagged
{
    _tag: string;
}

Затем я просто изменяю сигнатуру функции на:

function printTag(taggedObj: Tagged)
{
    console.log(taggedObj._tag);
}

Компилятор распознаетчто Tagged(Person) реализует этот интерфейс.

Если функция действительно нуждается в Tagged(Person), я бы использовал пересечение:

function printTaggedPerson(taggedPerson: Tagged & Person)
{
    console.log(taggedPerson.name); // Access to property of Person
    console.log(taggedPerson._tag); // Access to property of Tagged
}

По поводу следующего вопроса: TypeScriptиспользует структурную типизацию, поэтому, если классы структурно одинаковы, ошибка не выдается.

...