Мне нужно написать файл определения для внешней библиотеки. Я расширяю класс с помощью объединения интерфейсов, и бывают случаи, когда поле библиотечного класса относится к тому же типу, что и сам экземпляр. Демо-код:
// 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) Ambient d.ts с декларацией класса и экспорта
2) Moduled d.ts (которое использует импорт из других библиотек), где объявлен интерфейс расширения.