Skip to content

fix the claim that static members cannot be overridden - #360

Merged
fey merged 1 commit into
mainfrom
fix/359-static-members-can-be-overridden
Aug 14, 2026
Merged

fix the claim that static members cannot be overridden#360
fey merged 1 commit into
mainfrom
fix/359-static-members-can-be-overridden

Conversation

@fey

@fey fey commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Closes #359

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

Урок утверждал: «В отличие от JavaScript в TypeScript статические свойства и методы не могут быть переопределены в подклассах», и приводил пример с двумя пометками // Error!.

Утверждение неверное. Пример из урока компилируется без единой ошибки:

$ tsc --noEmit --strict --target esnext --module esnext --moduleResolution bundler static-check.ts
TSC_EXIT=0

(typescript 6.0.3, тот же, что стоит в курсе.)

Заодно врал и следующий за ним фрагмент: console.log(ImageCustomFile.maxCustomFileSize) там подписан // 1000, хотя подкласс объявил 2000, и в рантайме печатается именно 2000. То есть студент, который проверит код руками, получит расхождение и с компилятором, и с выводом.

Что стало

Статические члены наследуются и переопределяются — так же, как в JavaScript. Настоящее ограничение TypeScript другое и одно: тип переопределённого члена должен остаться совместимым с родительским, иначе TS2417:

$ tsc --noEmit --strict … static-new-bad.ts
static-new-bad.ts(5,7): error TS2417: Class static side 'typeof TextCustomFile' incorrectly extends base class static side 'typeof CustomFile'.
  Types of property 'maxCustomFileSize' are incompatible.
    Type 'string' is not assignable to type 'number'.

Раздел переписан вокруг этого: сначала переопределение работает, потом ограничение по совместимости типов, потом подкласс, который ничего не переопределяет и пользуется родительскими членами.

Модификатор override, о котором спрашивает автор issue, в текст не вводится: он в курсе нигде не встречается, а для переопределения статики не требуется — tsc принимает код и без него. Требовать его начинает только noImplicitOverride, которого в tsconfig.json курса нет.

Проверка

Все три новых фрагмента прогнаны компилятором и запущены; вывод совпадает с комментариями в коде:

фрагмент результат
переопределение статики компилируется, печатает 2000, true, 1000
несовместимый тип ('unlimited' вместо числа) TS2417
подкласс без переопределения компилируется

make description-lint и make schema-validate зелёные.

Правки только в теории, задание и решение урока не тронуты.

@fey
fey merged commit 0851ed4 into main Aug 14, 2026
2 checks passed
@fey
fey deleted the fix/359-static-members-can-be-overridden 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.

Проверить пример в уроке Typescript: Статические методы и свойства

1 participant