Компилятор говорит, что универсальный метод класса ссылается на себя прямо или косвенно, но это не так - PullRequest
0 голосов
/ 22 сентября 2019

Когда у меня есть следующий код (ссылка на игровую площадку) :

class Cls<T = any> {

    method() {
        return this.is(new Cls);
    }

    is(suspect: Cls) { }

}

Почему я получаю следующую ошибку?

'method' неявно имеет возвращаемый тип 'any', потому что у него нет аннотации возвращаемого типа и на него ссылаются прямо или косвенно в одном из его выражений возврата.

[ПРАВКА] Я знаю, что могу добавить аннотацию возвращаемого типа, но зачем мне это делать, если она автоматически выводится как void.

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Похоже, вы уже знаете, как избежать ошибки (например, добавить где-нибудь аннотацию типа), но вы хотите знать , почему происходит ошибка.Для этого мы можем взглянуть на очень похожую сообщаемую проблему: microsoft / TypeScript # 26623, также известную как «Компилятор не может разрешить тип возвращаемого значения функции, даже если он возвращает функцию с известным типом возвращаемого значения» .

Это в основном ограничение дизайна TypeScript;компилятор считает, что ему нужно знать полный тип результата new Cls(), прежде чем он сможет определить, что вернет this.is(new Cls()) (хотя мы можем легко увидеть, что это void, несмотря ни на что)и поскольку полный тип new Cls() зависит от типа возвращаемого значения method(), компилятор сдается.Это не совсем полная история, потому что классы часто ссылаются на себя косвенно, а умозаключение обычно работаетНо что-то в параметре типа по умолчанию T = any используется непредвиденным образом.Вы можете подумать об открытии собственной проблемы в GitHub для получения более подробной информации или исправления, но я сильно подозреваю, что это будет считаться ограничением дизайна или даже дубликатом ранее связанной проблемы.

Согласно комментарий ведущего разработчика TypeScript :

Настоящая проблема здесь заключается в том, что две основные операции, выполняемые средством проверки - вывод и обнаружение ошибок - происходят в одно и то же время.Вы можете представить себе другой мир, в котором происходит весь вывод, тогда происходит вся проверка ошибок, что позволило бы избежать этой проблемы, потому что проверка того, может ли тип аргумента присваиваться типу параметра, будет только частью фазы проверки ошибок.Но это, вероятно, будет как минимум вдвое медленнее, чем текущая реализация.

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

Хорошо, надеюсь, это поможет;удачи!

0 голосов
/ 22 сентября 2019

Вы должны явно определить тип возврата метода method () .Сделай так: method(): any

...