Обновлено:
Сегодня в PR от коллеги столкнулся с подобной записью const args = [8, 5] as const;
и меня удивило наличие as const
.
Что же это за конструкция и в чём её польза?
Начнём с простого примера на TS:
const args2 = [8, 5];
const args = [8, 5] as const;
const angle = Math.atan2(...args);
console.log(angle);
Этот код скомпилируется в такой d.ts код:
declare const args2: number[];
declare const args: readonly [8, 5];
declare const angle: number;
И в такой JS код:
"use strict";
const args2 = [8, 5];
const args = [8, 5];
const angle = Math.atan2(...args);
console.log(angle);
Как видно из результатов компиляции, разница между args2
и args
есть только в d.ts
.
В чём лаключается разница?
args2
- можно изменять, т.е.выполнить команду push и ей подобные.args
- изменение заблокировано
Есть тут ещё как минимум одна польза,
её видно при попытке выполнить такой код Math.atan2(...args)
и такой Math.atan2(...args2)
.
Во втором случае мы получим ошибку от компилятора:
A spread argument must either have a tuple type or be passed to a rest parameter.
Что дословно переводится так:
Аргумент распространения должен иметь тип кортежа или передаваться в параметр rest.
Понимается это так:
Количество передаваемых аргументов отличается от ожидаемого количества аргументов.
Весьма странное замечание, но as const
приходит к нам на помощь.
Подведём итоги того что полезного от можно получить as const
:
- Позволяет сделать
readonly
константу - Устраняет ошибку при передаче массива в функцию при помощи спред оператора
Больше примеров тут