Skip to content

fix the function overloading claim in the type-narrowing theory - #356

Merged
fey merged 1 commit into
mainfrom
fix/355-overload-does-not-narrow
Aug 5, 2026
Merged

fix the function overloading claim in the type-narrowing theory#356
fey merged 1 commit into
mainfrom
fix/355-overload-does-not-narrow

Conversation

@fey

@fey fey commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Closes #355

Репорт от студента: в теории урока «Сужение типа (Narrowing)» утверждалось, что перегрузка функций — пример работы сужения типов. Это неверно.

Что не так

Перегрузка сама по себе типы не сужает: компилятор не переносит типы из сигнатур перегрузок в тело реализации. Старый пример проходил проверку только за счёт any и ломался, как только any заменяли на unknown.

Проверено на tsc 5.8.3 --strict:

Проверка Результат
старый пример как есть (any) компилируется
то же, но anyunknown TS18046: 'a' is of type 'unknown' в ветке else
перегрузки + реализация (a: string | number, …), без typeof TS2339: Property 'toFixed' does not exist on type 'string | number'

Третья проверка решающая: даже когда все сигнатуры перегрузок описывают одинаковые типы параметров, тело реализации видит полный union без какого-либо сужения. Всё сужение в примере давал typeof, а не перегрузка.

Что сделано

Тезис переформулирован на противоположный: перегрузка не сужает типы, и именно поэтому внутри реализации нужны защитники типа. Пример выровнен с предыдущим уроком 85-function-overloads, где то же самое уже написано корректно — с unknown и проверкой number-first.

Правки в ru и en (локали es у курса нет). Код упражнения не менялся.

Проверка

  • сниппет, извлечённый скриптом прямо из отредактированных ru/README.md и en/README.md, компилируется: tsc --strict --noEmitexit=0
  • rumdl check (конфиг из base-image/common/.rumdl.toml, цель markdown-lint) → No issues found in 2 files

Кстати, ошибка прошла CI потому, что проверка типов в CI не включена — #344.

🤖 Generated with Claude Code

Function overloading does not narrow types: the compiler does not transfer
types from the overload signatures into the implementation body. The old
example type-checked only because of `any`, and broke as soon as `any` was
replaced with `unknown`.

Reframe the claim and align the example with the 85-function-overloads
lesson, which already uses `unknown` plus a number-first type guard.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@fey
fey merged commit 889aa9b into main Aug 5, 2026
2 checks passed
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