انتقل إلى المحتوى

TypeScript والوحدات

ما يقبله Elide وما يرفضه عند إزالة أنواع TypeScript، و 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
الواجهةمُصرَّح بها
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، .mtsوحدة ES
.cjs، .ctsCommonJS
.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 "./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'

أمثلة

انظر أيضًا

هل كانت هذه الصفحة مفيدة؟