Почему компилятор tsc не добавляет в импорты расширение .js?

Компилятор TypeScript (tsc) не добавляет расширение ".js" к импортам по нескольким причинам.

Во-первых, TypeScript разработан как надмножество JavaScript, то есть любой допустимый JavaScript код является допустимым TypeScript кодом. Импорты в JavaScript обычно не содержат расширений файлов, поскольку интерпретатор языка, как правило, может самостоятельно определить, какой тип файла имеет импортируемый модуль. TypeScript компилятор унаследовал этот подход, что позволяет сделать код максимально совместимым с существующим JavaScript кодом.

Во-вторых, TypeScript поддерживает различные модульные системы, такие как CommonJS, AMD, ES modules и UMD, каждая из которых имеет свои соглашения об именовании файлов и расширениях. Компилятор автоматически определяет, какую систему модулей использовать, основываясь на настройках проекта и импортах в коде. Поэтому добавление расширения ".js" может нарушить соответствие с данными соглашениями, что приведет к ошибкам или непредвиденному поведению.

Кроме того, добавление расширения ".js" к импортам в TypeScript может привести к конфликтам при работе с другими модулями. Если команда импорта содержит расширение файла, это может создать неоднозначность, если в проекте есть два файла с одинаковым именем, но разными расширениями.

Вместо этого, компилятор TypeScript предоставляет возможность настройки расширений файлов по умолчанию. В файле tsconfig.json, который представляет собой конфигурацию проекта TypeScript, можно указать эти настройки в параметре "moduleResolution". Например, для использования расширения ".js" в импортах, можно задать:

{
  "compilerOptions": {
    "moduleResolution": "node",
    "allowJs": true,
    "resolveExtensions": [".js", ".ts"]
  }
}

Это позволяет компилятору TypeScript корректно обрабатывать импорты с расширением ".js" и расширением ".ts" в проекте.