如何键入以Mixin作为参数类型的打字稿函数?

时间:2018-12-19 19:06:33

标签: typescript mixins

说我有

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()); 

由于TaggedPointOtherTaggedPoint不同,这会导致编译错误吗?

1 个答案:

答案 0 :(得分:1)

首先,我将为混入所提供的内容提供一个命名接口:

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使用结构化类型,因此,如果类在结构上相同,则不会引发任何错误。