如何推断实例类型以用作字段类型(使用接口合并)?

时间:2019-03-21 10:45:20

标签: typescript generics interface instance type-inference

我需要为外部库编写定义文件。我使用接口合并来扩充类,并且在某些情况下,库类的字段与实例本身的类型相同。演示代码:

// Augmentation
declare global {
    interface Class<T = any> {
        doesntInfer: T;
        infersFine(this: T): T;
    }

    class Class {}
}

但是当我尝试使用它时,方法返回类型可以正确推断,但是字段仍然是typeof任何类型:

public test(arg: Class) {
    arg.infersFine().infersFine().infersFine(); // works, infersFine() return type is Class
    arg.doesntInfer.; // doesn't work, type == any
}

如果没有接口合并,我只需这样做:

class Class {
    public doesntInfer: this;
    public infersFine(): this;
}

但是我不能在接口声明中使用this。我也不想简单地使用Class而不是T,因为我希望能够使用继承。 甚至有可能吗?

P.S。我进行接口合并,因为声明分为两个文件: 1)附有类别和出口声明的环境文件 2)模块化d.ts(使用其他库的导入),其中声明了增强接口。

1 个答案:

答案 0 :(得分:0)

正如Titian Cernicova-Dragomir所指出的,您实际上可以在界面中使用this,所以

interface Class {
    doesntInfer: this;
    infersFine(): this;
}

按预期工作。