Полиморфный тип this¶
Как в предке описать тип потомка и при чем здесь полиморфный тип this - сможет ответить текущая глава.
this - как тип¶
В TypeScript существует возможность указывать в качестве типа полиморфный тип this.
Полиморфный тип — это тип, который представляет множество типов как единое целое.
Полиморфный тип this является совокупностью типов, определяющих тип экземпляра. Кроме того, полиморфный тип this доступен для указания только в классах и интерфейсах.
Чтобы понять, о чем идет речь, нужно представить два класса, связанных с помощью механизма наследования, и в каждом из них объявлен метод, возращаемое значение которого принадлежит к типу представляющего экземпляр класса, в котором он определен.
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Если создать экземпляр подкласса и вызвать по цепочке метод подкласса, а затем — суперкласса, то операция завершится успехом.
1 2 3 | |
Если попробовать изменить порядок вызова методов, то возникнет ошибка. Произойдет это по той причине, что метод, объявленный в суперклассе, возвращает значение, принадлежащее к типу самого суперкласса, который ничего не знает о методах, объявленных в его подтипах.
1 2 3 | |
Можно, конечно, в качестве возвращаемого значения указать тип any, но, помимо того, что пропадет автодополнение, ещё и пострадает семантическая привлекательность кода.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
TypeScript предлагает решить эту проблему с помощью полиморфного типа this. Ожидаемое поведение достигается за счет того, что полиморфный тип this является множеством типов, определяемым цепочкой наследования. Другими словами, тип this будет принадлежать к тому же типу, что и экземпляр подкласса, который принадлежит к типу подкласса и типу суперкласса одновременно.
Такое поведение называется F-ограниченный полиморфизм (F-bounded polymorphism).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
Стоит отдельно подчеркнуть, что полиморфный тип this не принадлежит к типу класса или интерфейса, в котором указан. Полиморфный тип this может быть определен только на основе экземпляра класса. Проще говоря, полиморфный тип this принадлежит к типу своего экземпляра и может быть определен только в момент создания экземпляра. Также тип this совместим с типом any, а, при условии, что флаг --strictNullChecks установлен в false, ещё и к типам null и undefined. К тому же тип this совместим с типом экземпляра, ссылку на который можно получить с помощью ключевого слова this.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | |
Не будет лишним упомянуть, что в тех случаях, когда тип не указан явно, а в качестве значения выступает ссылка на экземпляр (this), то вывод типов будет указывать на принадлежность к полиморфному типу this.
1 2 3 4 5 6 7 8 9 10 | |