Машинопись не распознает свойства родительского класса?

У меня есть базовое наследование, как так:У меня проблема с тем, чтобы заставить работать приведенный выше фрагмент.---- +: = 1 =: + ---- .Тем не менее, он существует на B, и, поскольку он является общедоступным, A должен быть в состоянии достичь пропуска через ---- +: = 2 =: + ---- .Я попробовал следующее:То же, что и выше - не компилируется.(Свойство prop не существует для типа A)Если я добавлю ---- +: = 3 =: + ---- к ---- +: = 4 =: + ---- , то ---- +: = 5 =: + ---- становится ---- +: = 6 =: + ----, а не ---- +: = 7 =: + ---- .Если я добавлю ---- +: = 8 =: + ---- к ---- +: = 9 =: + ---- , произойдет то же самое.Весь смысл наследования с помощью абстрактных классов состоит в том, чтобы делиться ---- +: = 10 =: + ---- scope.Как я могу сделать это правильно с Typescript?
4 голоса | спросил Aris 10 Jpm1000000pmTue, 10 Jan 2017 22:50:19 +030017 2017, 22:50:19

3 ответа


0
Я согласен с Дж. Б. Низетом.Но у вас также есть возможность определить ---- +: = 0 =: + ---- как абстрактное свойство.Таким образом, ваш базовый класс знает о ---- +: = 1 =: + ---- , и все расширяющие классы должны реализовать абстрактное свойство ---- +: = 2 =: + ---- :Возможность определения абстрактных свойств появилась в TS 2.0: https://github.com/Microsoft/TypeScript/issues/4669.ОбновитьПроблема OP, с которой столкнулся этот подход, см. Комментарии, заключалась в том, что абстрактное свойство использовалось в конструкторе абстрактного базового класса.Это не будет работать, поскольку свойству присваивается начальное значение из производного класса первым после создания экземпляра объекта.Существует проблема github для этой проблемы, где решение заключается в простой ошибке доступа к абстрактным свойствам в конструкторе абстрактного класса.
ответил Alex 10 Jpm1000000pmTue, 10 Jan 2017 23:50:27 +030017 2017, 23:50:27
0
Вот как вы должны определить свои два класса:Помещение свойства в класс Animal говорит компилятору, что у всех животных есть звук.Размещение звука в качестве аргумента конструктора суперкласса проясняет, что все подклассы должны указывать свой звук при создании экземпляра.Существуют и другие возможные варианты, но если суперклассу требуется доступ к свойству sound или к некоторому методу getSound (), то это свойство /метод должно существовать в базовом классе.
ответил JB Nizet 10 Jpm1000000pmTue, 10 Jan 2017 23:42:43 +030017 2017, 23:42:43
0
Сообщение об ошибке совершенно верно: ---- +: = 0 =: + ---- не существует в ---- +: = 1 =: + ---- , потому что оно существует в ----+: = 2 =: + ---- .Вы можете исходить из JavaScript, где то, что вы сделали, просто отлично.Основное различие между TypeScript и JavaScript заключается в том, что TypeScript строго типизирован, а JavaScript - слабо типизирован.Эта разница требует изменения в вашем мышлении.В слабо типизированном языке, таком как JavaScript, просто не имеет значения, что ---- +: = 3 =: + ---- не существует в ---- +: = 4 =: + ---- .Типы разрешаются во время выполнения, и если ваш фактический экземпляр имеет ---- +: = 5 =: + ---- , все будет хорошо.В статически (или строго) типизированном языке все иначе.Типы применяются во время компиляции, и если ---- +: = 6 =: + ---- не определяет ---- +: = 7 =: + ---- , он не может его использовать.Вот почему строго типизированные языки позволяют определять абстрактные члены: делать их доступными в базовых классах, но фактически определять rhem в производных классах.Поскольку не все версии TypeScript напрямую поддерживают абстрактные свойства , это решение должно работать в любом случае:
ответил Sefe 11 Jam1000000amWed, 11 Jan 2017 00:05:02 +030017 2017, 00:05:02

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132