Как вывести тип экземпляра для использования в качестве типа поля (используя объединение интерфейса)? - PullRequest
0 голосов
/ 21 марта 2019

Мне нужно написать файл определения для внешней библиотеки. Я расширяю класс с помощью объединения интерфейсов, и бывают случаи, когда поле библиотечного класса относится к тому же типу, что и сам экземпляр. Демо-код:

// 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 (которое использует импорт из других библиотек), где объявлен интерфейс расширения.

1 Ответ

0 голосов
/ 21 марта 2019

Как отметил Тициан Черникова-Драгомир, вы на самом деле МОЖЕТЕ использовать this в интерфейсе, поэтому

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

работает как задумано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...