думаю что до вызова конструктора он ещё не вывел тип, и ты какбы переопределяешь тип, а в кторе ты присваиваешь в уже известный тип, и это подстановка
При наследовании (extends Component<any, StateTypes>) на тип this накладывается ограничение в виде типа инстанса базового класса (то есть производный класс может только сузить тип this). Так как в первом случае производный класс не объявляет своих полей и методов, тип this не сужается, так что this.state имеет тип StateTypes = { destiny: DestinyType }, и присваивание в this.state не вызывает ошибок. Но объявление поля state в классе (второй вариант) не только присваивает значение в this.state, но и задаёт тип этого поля. Поскольку тип не указан явно, он выводится из присваиваемого значения как { destiny: string }. Однако { destiny: string } не является сужением { destiny: DestinyType }, то есть тип инстанса производного класса не является сужением типа инстанса базового класса — об этой ошибке и сообщает TS. Поправить ошибку можно либо явным заданием типа поля state: StateTypes при объявлении, либо указанием as const для значения поля в этом объявлении: play.
Обсуждают сегодня