Видеоуроки, интерактивный редактор и сохранение прогресса — бесплатно, сразу после входа.
ВойтиСоздать аккаунт — бесплатноЗакончили урок?
Войдите, чтобы отмечать прогресс
T объявлен у класса и используется в конструкторе, поле и обоих методах. R объявлен у метода map и существует только внутри одного вызова. Цепочка выглядит так:
new Box("Макс") выводит T = string, получается Box<string>..map((name) => name.length) выводит R = number, получается Box<number>..get() возвращает number.Если объявить оба параметра у класса, class Box<T, R>, то R пришлось бы знать заранее, при создании коробки. А один и тот же экземпляр можно мапить сколько угодно раз в разные типы:
Правило: параметр объявляют там, где он рождается. Тип содержимого рождается при создании экземпляра, тип результата при вызове метода.
Это та же идея, что у Array<T> с map<U> из задания 3, и у Promise<T> с then<R>. Контейнер помнит, что внутри, а преобразование создаёт новый контейнер с новым типом.