Freshness¶
TypeScript предоставляет концепцию Freshness (также называемую строгой проверкой литеральных объектов), чтобы упростить проверку типов литеральных объектов, которые без этой особой проверки были бы структурно совместимы.
Структурная типизация крайне удобна. Рассмотрим следующий фрагмент кода. Это позволяет вам очень удобно обновить ваш JavaScript до TypeScript, предохраняя типы на определённом уровне:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Тем не менее, структурная типизация имеет недостаток: она вводит в заблуждение мыслью, что что-то способно принимает больше данных, чем на самом деле. Это показано в следующем коде, на котором TypeScript будет выдавать ошибку:
1 2 3 4 5 6 7 8 |
|
Обратите внимание, что эта ошибка возникает только для литералов объекта. До этой ошибки можно посмотреть на вызов logName({ name: 'мэтт', job: 'быть потрясающим' })
и подумать, что logName выполнится с job
, когда на деле жестко отклоняет его.
Другой важный пример использования относится к интерфейсам, которые имеют необязательные элементы, и, следовательно, не подлежат такой же проверке типа, как и литеральные объекты. Но и в этом случае опечатка будет проверена на тип просто великолепно. Это продемонстрировано ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Причина, по которой только объектные литералы проверяются по типу таким образом, заключается в том, что в этом случае дополнительные свойства, которые на самом деле не используются, почти всегда являются опечаткой или неправильным пониманием API.
Разрешение дополнительных свойств¶
Тип может включать сигнатуру индекса, чтобы явно указать, что дополнительные свойства разрешены:
1 2 |
|
Пример использования: React State¶
Facebook ReactJS предлагает хороший вариант использования для freshness объекта. Довольно часто в компоненте вы вызываете setState
с несколькими свойствами вместо того, чтобы передавать все свойства, т.е.
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Используя идею freshness, вы пометите все элементы как необязательные и вы все равно сможете отловить опечатки!:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|