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>value | Precompiler failed with 1 diagnostic(s): … [ERROR] Unexpected token; используйте value as string |
export = value | SyntaxError: … Expected an operand but found export |
paths из tsconfig.json | Игнорируется: TypeError: Module not found: '@lib/ |
В импорте можно указать файл .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 6JSX
Файлы .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>| Ввод | Результат |
|---|---|
/ в начале файла .tsx | Импортирует preact/jsx-runtime |
jsxImportSource в tsconfig.json | Игнорируется; используется React |
/** @jsx h */ | Игнорируется; создаются элементы React |
JSX в файле .jsx | SyntaxError: … 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 tscbad-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.tsElide 1.6.0: 149 bytes| API | Объявлено |
|---|---|
Elide.version, debug, release, buildMode | Да |
Elide. | Типизировано как boolean; значение — строка |
Elide.serve() | Нет: Property 'serve' does not exist |
elide:postgres, elide:mysql | Да |
elide:sqlite, elide:cel, elide:telemetry | Нет |
import … from ". | Да, как any |
Модули node:* | Да, через @types/node |
Тег nightly следует за самыми новыми объявлениями; latest указывает на более старую версию.
ES-модули и CommonJS
| Файл | Система модулей |
|---|---|
.mjs, .mts | ES-модуль |
.cjs, .cts | CommonJS |
.ts, .tsx | ES-модуль |
.js | ES-модуль, если в ближайшем package.json есть "type": "module", иначе CommonJS |
Файл .js с инструкциями import и без "type": "module" завершается ошибкой
SyntaxError: … Expected an operand but found import; добавьте поле или переименуйте файл в .mjs.
| Возможность | Поведение |
|---|---|
import lib, { a } from ". | module.exports — экспорт по умолчанию, его свойства — именованные экспорты |
await import(". | Работает |
require("./lib.mjs") | Error: require() of ES Module … not supported. (ERR_REQUIRE_ESM); используйте await import() |
createRequire(import. | Работает |
import.meta.url, .filename, .dirname | Работают |
import.meta.main, import.meta.resolve | undefined |
__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"); // CommonJSexports и imports пакета
Поле package.json | import | require() |
|---|---|---|
Подпути 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' |