Причина, по которой вы не получаете никаких ошибок с ref, заключается в том, что оба ваших компонента являются производными одного базового класса React.Component в вашем примере, но они не имеют различий свойства и не имеют явного интерфейса.
Проверьте раздел о совместимости типов в Typescript:
https://www.typescriptlang.org/docs/handbook/type-compatibility.html
Поскольку Typescript использует структурные, а не номинальные подтипы, классы можно объединять и сравнивать как равные в следующих сценариях:
- Оба имеют одинаковые члены собственности
- Ни у кого нет каких-либо членов собственности (это не реалистичный случай, но это тот, который у вас есть)
- У одного класса могут быть члены, которых у другого нет, но ТОЛЬКО если он имеет все свойства другого класса. Например. он может добавлять вещи, но не вводить новые вещи
- Конструкторы могут отличаться
- Вы также можете переопределить тот же элемент свойства
Во всех остальных случаях они несовместимы.
Если вы переписываете на:
React.createRef<HTMLInputElement>();
Вы четко увидите, что ссылки указаны как несовместимые, например, с вашими компонентами.
Это потому, что React.Component никоим образом не совместим с типом HTMLElement (который HTMLInputElement является производным от, например, эти классы имеют разные свойства).
Дело не в том, что это утверждение не работает, скорее в том, как именно оно работает под капотом, что соответствует правилам, изложенным сверху.
Вернуться к рассмотрению вопроса
Вы можете сделать несколько вещей, чтобы избежать подобных проблем, в зависимости от вашей ситуации,
У вас есть 2 компонента с различными реактивными характеристиками.
В случае, если у ваших компонентов разные реквизиты, создайте интерфейсы для обоих, и у вас не возникнет этой проблемы, поскольку она выдаст ошибку типа, что реквизиты на этих компонентах не совпадают, что верно.
У вас есть 2 компонента без пользовательских свойств реакции
Ваша текущая проблема. Если вы добавите новый элемент свойства в SomeOtherComponent , который не существует в классе Модальный , например, open = () =>
, тогда они будут разрешены как разные.
Резюме
Если вы не можете добавить интерфейс, и у вас нет разных членов свойства в этих 2 классах, то вполне реально, что это один и тот же класс.
Вам просто нужно найти лучший способ, как использовать его для обоих сценариев.