Избегайте аннотирования типов, когда TypeScript может сделать их вывод.
• Код должен содержать аннотации типов для сигнатур функций и методов, но не для местных переменных в их телах.
• Чтобы предотвратить ошибки реализации в коде пользователя, попробуйте применить явные аннотации для объектных литералов и возвращаемых типов функций, даже если они могут быть выведены.
1 Ұнайды
el is HTMLInputElement, будучи возвращаемым типом, сообщает модулю проверки, что он может сузить тип параметра, если функция вернет true.
объект String может быть всегда равен только себе:
> "hello" === new String("hello")
false
> new String("hello") === new String("hello")
false
Вы можете встретить такой вид кода: const bob = {}. Это оригинальный вариант синтаксиса, соответствующий утверждению, и он является эквивалентом {} as Person.
Может ли тройка быть назначена для пары? Думая в категориях структурной типизации, вы можете ожидать, что это возможно. В паре есть ключи 0 и 1, так не может ли она иметь и другие тоже? Например, 2?
const triple: [number, number, number] = [1, 2, 3];
const double: [number, number] = triple;
// ~~~~~~ '[number, number, number]' не может быть назначен
// для '[number, number]'.
// Типы свойства 'length' являются несовместимыми.
// Тип '3' не может быть назначен для типа '2'.
Нет, и по весьма интересной причине. Вместо того чтобы моделировать пару чисел как {0: number, 1: number}, TypeScript моделирует ее как {0: number, 1: number, length: 2}.
extends также может оказаться ограничителем в обобщенных типах, сохраняя при этом значение подмножества (правило 14):
function getKey(val: any, key: K) {
// ...
}
Что значит расширить string? Будет сложно представить это в рамках наследования объекта или пытаться определить подкласс оберточного объекта типа String (правило 10).
В контексте наборов значений все просто: расширением станет любой тип, чья область является подмножеством string: и литеральные типы, и объединения строковых литеральных типов, и сами string:
getKey({}, 'x'); // ok, 'x' расширяет string
На рис. 8.3 приведен пример, составленный с помощью инструмента madge, изображающий JavaScript-проект среднего размера.
JavaScript применяет утиную типизацию, а TypeScript ее моделирует при помощи структурной типизации.
В TypeScript может изменяться значение переменной, но не ее тип. Единственный распространенный случай изменения типа — это его сужение (правило 22). Однако уменьшенный тип не может включать новые значения. Несмотря на то что все же существует несколько важных исключений (правило 41), это всего лишь исключения, но не правила.
Следует запомнить
• Если функция не модифицирует свои параметры, то их следует объявить readonly. Так контракт функции станет более ясным и исчезнет вероятность непредусмотренных изменений при ее реализации.
• Используйте readonly против ошибок, связанных с изменениями, и для обнаружения мест в коде, где изменения происходят.
• Изучайте разницу между const и readonly.
• Имейте в виду, что readonly ограничен.
