Skip to content

introduce as const through immutability in the type-hierarchy theory - #361

Merged
fey merged 1 commit into
mainfrom
fix/312-as-const-motivation
Aug 14, 2026
Merged

introduce as const through immutability in the type-hierarchy theory#361
fey merged 1 commit into
mainfrom
fix/312-as-const-motivation

Conversation

@fey

@fey fey commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Closes #312

Что было не так

В теории «Иерархия типов» as const вводился как способ передать ровно два числа в Math.atan2():

const args = [8, 5] as const; // readonly [8, 5]
const angle = Math.atan2(...args); // okay

Замечание из фидбека справедливо: здесь as const решает проблему арности, а не неизменяемости. Естественный инструмент для этой задачи — аннотация кортежем, const args: [number, number] = [8, 5]. Студент видит приём в контексте, где приём не самый уместный.

Вдобавок этот же пример со спредом уже разобран раньше, в 20-functions/80-rest-spread, и там as const подан ровно так же. То есть урок иерархии типов повторял чужой пример, а свою тему — нисходящее приведение — им не иллюстрировал.

Что стало

Начало раздела не тронуто: const args = [8, 5] с ошибкой на спреде остаётся, потому что это хорошая демонстрация неявного восходящего приведения — компилятор расширил [8, 5] до number[].

Дальше развилка вместо одного ответа:

  • арность лечится аннотацией кортежа, и приведение для этого не нужно вовсе;
  • кортеж фиксирует длину, но не запрещает запись (args[0] = 100 проходит), и тип элемента остаётся number;
  • если значения меняться не должны — as const, и вот это уже нисходящее приведение: readonly [8, 5] вместо number[], запись отвергается.

Заканчивается раздел явным противопоставлением, которого раньше не было: аннотация кортежем называет нужный тип, as const запрещает компилятору расширять уже написанное.

Пересечения с 25-types/25-literal-types нет: там as const показан на объекте конфигурации, здесь — на сужении типа массива, и мотив назван через иерархию множеств, а не через «неизменяемость» вообще.

Проверка

Компилятором (typescript 6.0.3, --strict):

фрагмент результат
const args: [number, number] = [8, 5] + спред + args[0] = 100 компилируется, ошибок нет
const args = [8, 5] as const + args[0] = 100 TS2540: Cannot assign to '0' because it is a read-only property.

Текст ошибки в комментарии совпадает с тем, что печатает компилятор.

make description-lint и make schema-validate зелёные. Задание урока и решение учителя не тронуты, раздел про восходящее/нисходящее приведение сохранён.

@fey
fey merged commit 676bd9d into main Aug 14, 2026
2 checks passed
@fey
fey deleted the fix/312-as-const-motivation branch August 14, 2026 12:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Проверить пример в уроке Иерархия Типов

1 participant