Похоже, вы уже знаете, как избежать ошибки (например, добавить где-нибудь аннотацию типа), но вы хотите знать , почему происходит ошибка.Для этого мы можем взглянуть на очень похожую сообщаемую проблему: microsoft / TypeScript # 26623, также известную как «Компилятор не может разрешить тип возвращаемого значения функции, даже если он возвращает функцию с известным типом возвращаемого значения» .
Это в основном ограничение дизайна TypeScript;компилятор считает, что ему нужно знать полный тип результата new Cls()
, прежде чем он сможет определить, что вернет this.is(new Cls())
(хотя мы можем легко увидеть, что это void
, несмотря ни на что)и поскольку полный тип new Cls()
зависит от типа возвращаемого значения method()
, компилятор сдается.Это не совсем полная история, потому что классы часто ссылаются на себя косвенно, а умозаключение обычно работаетНо что-то в параметре типа по умолчанию T = any
используется непредвиденным образом.Вы можете подумать об открытии собственной проблемы в GitHub для получения более подробной информации или исправления, но я сильно подозреваю, что это будет считаться ограничением дизайна или даже дубликатом ранее связанной проблемы.
Согласно комментарий ведущего разработчика TypeScript :
Настоящая проблема здесь заключается в том, что две основные операции, выполняемые средством проверки - вывод и обнаружение ошибок - происходят в одно и то же время.Вы можете представить себе другой мир, в котором происходит весь вывод, тогда происходит вся проверка ошибок, что позволило бы избежать этой проблемы, потому что проверка того, может ли тип аргумента присваиваться типу параметра, будет только частью фазы проверки ошибок.Но это, вероятно, будет как минимум вдвое медленнее, чем текущая реализация.
Не существует определенной практики, которая позволит избежать всех проблем с цикличностью.Я бы сказал, что аннотация типа возврата - лучшая альтернатива для этого примера.
Хорошо, надеюсь, это поможет;удачи!