Перейти к содержимому

TypeScript и модули

Что принимает и что отклоняет удаление типов TypeScript в Elide, JSX, проверка типов через tsc и @elide-dev/types, и как разрешаются ES-модули, CommonJS, JSON и exports.

На этой странице

Elide запускает файлы .ts, .mts, .cts и .tsx, удаляя из них типы; он не проверяет типы и не читает tsconfig.json.

Синтаксис TypeScript

СинтаксисСтатус
Аннотации типов, интерфейсы, type, обобщения, as, satisfies, !Удаляются
import type, import { type X }Удаляются
enum, const enumКомпилируются в объекты
namespaceКомпилируется
Свойства-параметры конструктора (constructor(public x: number))Компилируются
abstract, поля declare, override, accessorПоддерживаются
import fs = require("node:fs")Поддерживается
Декораторы классов и методовСтандартные декораторы: каждый получает (value, context)
Декораторы в стиле experimentalDecoratorsНе поддерживаются; они получают стандартные аргументы
Декораторы параметров (constructor(@inject x))SyntaxError: … expected BindingIdentifier or BindingPattern
Утверждения типа вида <string>valuePrecompiler failed with 1 diagnostic(s): … [ERROR] Unexpected token; используйте value as string
export = valueSyntaxError: … Expected an operand but found export
paths из tsconfig.jsonИгнорируется: TypeError: Module not found: '@lib/math'

В импорте можно указать файл .ts, расширение .js или не указывать расширение; все три варианта разрешаются в math.ts:

import { add } from "./src/lib/math.ts";
import { add as add2 } from "./src/lib/math.js";
import { add as add3 } from "./src/lib/math";
console.log(add(1, 2), add2(2, 2), add3(3, 3));
3 4 6

JSX

Файлы .tsx используют автоматическую среду выполнения JSX и импортируют react/jsx-runtime. Установите React сами:

// app.tsx
import { renderToString } from "react-dom/server";

function Hello({ name }: { name: string }) {
  return <p>hello {name}</p>;
}

console.log(renderToString(<Hello name="elide" />));
elide install --ecosystems=npm   # react, react-dom in package.json
elide app.tsx
<p>hello <!-- -->elide</p>
ВводРезультат
/** @jsxImportSource preact */ в начале файла .tsxИмпортирует preact/jsx-runtime
jsxImportSource в tsconfig.jsonИгнорируется; используется React
/** @jsx h */Игнорируется; создаются элементы React
JSX в файле .jsxSyntaxError: … Expected an operand but found <; переименуйте файл в .tsx

Проверка типов

Установите TypeScript и запускайте его компилятор через Elide:

{
  "scripts": { "typecheck": "tsc --noEmit" },
  "devDependencies": { "typescript": "^5.9.0", "@types/node": "^24.0.0" }
}
{
  "compilerOptions": {
    "module": "nodenext",
    "target": "esnext",
    "strict": true,
    "noEmit": true,
    "allowImportingTsExtensions": true,
    "erasableSyntaxOnly": true,
    "verbatimModuleSyntax": true,
    "types": ["node"]
  }
}
elide install --ecosystems=npm
elide run typecheck              # or: elide run tsc
bad-types.ts(1,7): error TS2322: Type 'string' is not assignable to type 'number'.

При ошибках типов tsc завершается с кодом 2. Параметры компилятора передавайте после --: elide run tsc -- --version. С параметром erasableSyntaxOnly компилятор tsc отклоняет перечисления, пространства имён и свойства-параметры; уберите этот параметр, если вы их используете.

Типы Elide

@elide-dev/types объявляет собственные глобальные объекты и модули Elide и подключает @types/node. Добавьте пакет как зависимость для разработки и укажите его в types:

{
  "type": "module",
  "scripts": { "typecheck": "tsc --noEmit" },
  "devDependencies": { "typescript": "^5.9.0", "@elide-dev/types": "nightly" }
}
{
  "compilerOptions": {
    "module": "nodenext",
    "target": "esnext",
    "strict": true,
    "noEmit": true,
    "allowImportingTsExtensions": true,
    "types": ["@elide-dev/types"]
  }
}
// main.ts
import { Database } from "elide:postgres";
import { readFileSync } from "node:fs";

const bytes: number = readFileSync("package.json").length;
console.log(`Elide ${Elide.version}: ${bytes} bytes`);
export const open = (url: string) => Database.connect(url);
elide install --ecosystems=npm
elide run typecheck
elide main.ts
Elide 1.6.0: 149 bytes
APIОбъявлено
Elide.version, debug, release, buildModeДа
Elide.targetArchitectureТипизировано как boolean; значение — строка
Elide.serve()Нет: Property 'serve' does not exist
elide:postgres, elide:mysqlДа
elide:sqlite, elide:cel, elide:telemetryНет
import … from "./script.py"Да, как any
Модули node:*Да, через @types/node

Тег nightly следует за самыми новыми объявлениями; latest указывает на более старую версию.

ES-модули и CommonJS

ФайлСистема модулей
.mjs, .mtsES-модуль
.cjs, .ctsCommonJS
.ts, .tsxES-модуль
.jsES-модуль, если в ближайшем package.json есть "type": "module", иначе CommonJS

Файл .js с инструкциями import и без "type": "module" завершается ошибкой SyntaxError: … Expected an operand but found import; добавьте поле или переименуйте файл в .mjs.

ВозможностьПоведение
import lib, { a } from "./lib.cjs"module.exports — экспорт по умолчанию, его свойства — именованные экспорты
await import("./lib.cjs")Работает
require("./lib.mjs")Error: require() of ES Module … not supported. (ERR_REQUIRE_ESM); используйте await import()
createRequire(import.meta.url)Работает
import.meta.url, .filename, .dirnameРаботают
import.meta.main, import.meta.resolveundefined
__dirname в CommonJSРаботает
__filename во входном файле CommonJS"unknown"; используйте module.filename. Подключённые через require файлы получают настоящий путь.
__dirname, require в ES-модуляхОпределены, в отличие от Node; не полагайтесь на них

JSON

Все эти варианты загружают data.json:

import data from "./data.json" with { type: "json" };
import same from "./data.json";
const viaRequire = require("./data.json"); // CommonJS

exports и imports пакета

Поле package.jsonimportrequire()
Подпути exports ("./feature": …)РаботаетРаботает
exports для корня пакета, с mainРаботаетИспользует main
exports для корня пакета, без mainРаботаетError: Cannot find module 'pkg'
Условия import и defaultРаботают—
Условие require, указанное перед defaultВыбирается вместо default—
Неэкспортированный подпутьPackage subpath is not defined by "exports" field (без code)—
imports ("#internal")TypeError: Packages imports do not define the specifier: '#internal'Error: Cannot find module '#internal'

Примеры

См. также

Была ли эта страница полезной?