Команда TypeScript випустила новий прапорець компілятора у релізі 6.0 — --noPropertyAccessFromIndexSignature. Коли він увімкнений, компілятор забороняє доступ через крапкову нотацію до властивостей, що походять з індексного підпису (index signature), змушуючи розробників використовувати квадратні дужки та виявляючи потенційні значення undefined під час компіляції, а не у продакшені.
Чому цей прапорець важливий
У JavaScript об'єкти часто слугують словниками, і TypeScript дозволяє типізувати такі структури за допомогою індексного підпису, наприклад, Record<string, T>. Мова розглядає obj.key та obj["key"] як взаємозамінні, тому компілятор припускає, що властивість існує, навіть якщо ключ стає відомим лише під час виконання. Це приховане припущення є причиною багатьох збоїв: код, який звертається до obj.missingProp, успішно компілюється, запускається, а потім видає помилку, оскільки значення є undefined.
Крапкова нотація несе в собі неявну гарантію — вона повідомляє читачам та перевірнику типів, що властивість точно присутня. Квадратні дужки, навпаки, сигналізують про невизначеність — ключ може бути відсутнім, а результатом може бути undefined. --noPropertyAccessFromIndexSignature забезпечує цю візуальну та семантичну різницю, перетворюючи цілу групу помилок виконання на діагностику під час компіляції.
Як працює цей прапорець
Коли прапорець увімкнено, будь-який вираз, який звертається до властивості через індексний підпис за допомогою крапкової нотації, позначається як помилка. Код потрібно переписати, використовуючи квадратні дужки:
// Before
const name = userData.name; // OK even if "name" is not in the index
// After enabling the flag
const name = userData["name"]; // Error unless brackets are used
Потім компілятор застосовує ті самі правила обробки undefined, які він уже використовує для доступу через дужки. Якщо також увімкнено --noUncheckedIndexedAccess, тип userData["name"] стає T | undefined, що змушує розробника перевіряти випадок відсутності значення.
Практичні кроки для міграції
Увімкніть прапорець у
tsconfig.json:{ "compilerOptions": { "noPropertyAccessFromIndexSignature": true } }Запустіть перевірку типів. Усі звернення через крапкову нотацію до ключів індексного підпису з'являться як помилки.
Замініть крапки на дужки. Зміна є механічною і не впливає на продуктивність під час виконання.
Опрацюйте отримані типи
undefined. Додайте оператор об'єднання з null (nullish coalescing), опціональний ланцюжок (optional chaining) або явні перевірки там, де це необхідно.Розгляньте можливість поєднання з
--noUncheckedIndexedAccessдля створення найпотужнішого механізму захисту. Разом вони гарантують, що будь-який доступ у стилі словника розглядатиметься як такий, що може бути відсутнім.
Коли варто залишати явні властивості
Якщо поле є частиною стабільного API-контракту, оголошуйте його як явну властивість, а не покладайтеся на індексний підпис. Явні властивості продовжують дозволяти крапкову нотацію, зберігаючи гарантію того, що поле завжди буде присутнє (наскільки це може перевірити система типів). Залишайте індексні підписи для справді динамічних даних, де ключі невідомі заздалегідь.
Контраргумент: збільшення багатослівності
Деяким командам зайві дужки можуть здатися надмірними, особливо в кодових базах, де активно використовуються гнучкі об'єкти. Прапорець вимагає суворішої дисципліни, що може потребувати значного рефакторингу для застарілих (legacy) проєктів. У таких випадках прапорець можна впроваджувати поступово, можливо, обмеживши його новими модулями, поки вся кодова база з часом не перейде на цей паттерн.
На що звернути увагу далі
Цей прапорець є частиною ширшого руху в TypeScript 6.0 до суворішої типізації. Майбутні релізи можуть запровадити додаткові перевірки для розгортання об'єктів (object spread), опціонального ланцюжка або використання виведеного any. Стеження за дорожньою картою (roadmap) TypeScript допоможе командам вирішити, коли впроваджувати наступний набір функцій безпеки, не порушуючи графіки поставок.
Підсумок: Увімкнення --noPropertyAccessFromIndexSignature робить різницю між «ця властивість гарантована» та «ця властивість може бути відсутня» явною в коді, виявляючи цілу групу багів до того, як вони потраплять у продакшен. Перетворення тихої помилки під час виконання на помилку під час компіляції — це невелика зміна, яка має величезний вплив на надійність.
