Перейти до вмісту

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'

Приклади

Див. також

Чи була ця сторінка корисною?