Нет способа избежать этого. Структурная типизация необходима в TypeScript для взаимодействия с JavaScript и JSON. Это небольшая цена, которую мы должны заплатить, и следствие цели TypeScript, которая заключается в добавлении типов в JavaScript, при этом будучи полностью совместимым с ним и, особенно, с существующей кодовой базой.
Единственный способ избежать этого, в вашем примере, это добавить что-то к Dog
, которого Mammal
не имеет, или, может быть, сделать Mammal
абстрактным классом, чтобы его нельзя было непосредственно создан. В этом случае это было бы логично, так как вы можете создать новый Dog
, Cat
, Horse
... но не просто новый Mammal
.
Как указали Тициан и Эстус, простой вариант, если вы не хотите делать Mammal
абстрактным и хотите пойти по пути дифференциации классов, даже если вы действительно не хотите добавлять ничего лишнего, будет добавить нерелевантную частную собственность без (почти) какого-либо эффекта во время выполнения:
private isDog: undefined;