Поиск по сайту
Ctrl + K
Вопросы по TS

Объяснение стирания типов (type erasure) в TypeScript

Что такое стирание типов?

Стирание типов (type erasure) — это процесс, при котором типы, используемые в TypeScript, удаляются во время компиляции, чтобы скомпилированный JavaScript-код был независим от информации о типах. Это важная особенность, так как JavaScript не поддерживает систему типов, и все аннотации типов, добавленные в код TypeScript, становятся недоступными в конечном результате.

Как это работает?

Когда вы пишете код на TypeScript и компилируете его, компилятор TypeScript обрабатывает ваши типы и удаляет их из сгенерированного JavaScript. Например, рассмотрим следующий код:

function add(a: number, b: number): number {
    return a + b;
}

const result = add(10, 20);
console.log(result);

В процессе компиляции этот код будет преобразован в следующий JavaScript-код:

function add(a, b) {
    return a + b;
}

const result = add(10, 20);
console.log(result);

Как видно, все аннотации типов (: number) исчезли. В результате конечный код работает как обычный JavaScript, и при его выполнении информация о типах больше не доступна.

Зачем нужно стирание типов?

Стирание типов необходимо для следующего:

  • Совместимость с JavaScript: TypeScript был разработан для работы в экосистеме JavaScript, где типы не поддерживаются. Стирание типов позволяет TypeScript компилироваться в JavaScript, который можно выполнять в любом браузере или среде.
  • Упрощение процесса компиляции: Удаление информации о типах позволяет компилятору TypeScript создавать более простой и быстрый код без лишних метаданных, что улучшает производительность.
  • Пример с использованием дженериков

    Типы также стираются в контексте дженериков. Рассмотрим следующий пример:

    function identity<T>(arg: T): T {
        return arg;
    }
    
    const result = identity<string>("Hello, TypeScript!");
    console.log(result);
    

    После компиляции этот код станет:

    function identity(arg) {
        return arg;
    }
    
    const result = identity("Hello, TypeScript!");
    console.log(result);
    

    Тип <T> и его использование в функции identity исчезли, и на выходе мы имеем обычный JavaScript-код.

    Заключение

    Стирание типов является важной концепцией в TypeScript, позволяющей поддерживать совместимость с JavaScript и улучшать производительность. Зная о стирании типов, разработчики могут более осознанно использовать возможности TypeScript и избегать недопонимания на этапе компиляции и выполнения кода.