我需要为外部库编写定义文件。我使用接口合并来扩充类,并且存在库类的字段与实例本身的类型相同的情况。演示代码:
// Augmentation
declare global {
interface Class<T = any> {
doesntInfer: T;
infersFine(this: T): T;
}
class Class {}
}
但是当我尝试使用它时,方法返回类型被正确推断,但字段仍然是任何类型:
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
,因为我希望能够使用继承。它甚至可能吗?
附:我进行接口合并,因为声明分为两个文件:1)具有类和导出声明的环境d.ts 2)模块化d.ts(使用从其他库导入),其中声明了扩充接口。
正如Titian Cernicova-Dragomir指出的那样,你实际上可以在接口中使用this
,所以
interface Class {
doesntInfer: this;
infersFine(): this;
}
按预期工作。