开源 — MIT 许可证

SharpTS

面向 .NET 的 TypeScript 解释器和 AOT 编译器

既可作为脚本运行以即时获得反馈,也可编译为原生 .NET 程序集——并能完整访问 .NET 生态系统。

curl -fsSL https://sharpts.dev/setup.sh | sh
在 GitHub 上 Star
example.ts
// 直接在 .NET 上运行 TypeScript
interface Greeter {
    greet(name: string): string;
}

class WelcomeBot implements Greeter {
    constructor(private prefix: string) {}

    greet(name: string): string {
        return `${this.prefix}, ${name}! Welcome to SharpTS.`;
    }
}

const bot = new WelcomeBot("Hello");
console.log(bot.greet("Developer"));
// → Hello, Developer! Welcome to SharpTS.

SharpTS 能做什么

编写在 .NET 运行时上运行的 TypeScript——可解释执行以快速迭代,也可编译为原生 .NET 程序集。

即刻运行

让 SharpTS 指向一个 .ts 文件即可运行——无需构建步骤,无需配置。非常适合脚本、自动化以及在 REPL 中尝试想法。

编译为 .NET

预先编译为真正的 .NET 程序集——DLL、自包含可执行文件或 NuGet 包——以原生 CLR 速度运行。

双向互操作

通过 @DotNetType 从 TypeScript 调用 .NET 库,并从 C# 使用你编译后的 TypeScript。复用 BCL、NuGet 包以及你已有的代码。

广泛的 TypeScript 支持

使用熟悉的 TypeScript,包括泛型、类、装饰器、异步、模块等;代码运行前会进行类型检查。请参阅下方的实用兼容性概览。

融入你的 .NET 构建

SharpTS.Sdk 加入 .NET 项目,dotnet build 便会把你的 TypeScript 与 C# 一同编译——同一套工具链,同一种产物。

编辑器支持

语言服务器为 VS Code 和 Visual Studio 带来自动补全、类型检查和转到定义。

实际体验

真实的 TypeScript 运行在 .NET 运行时上

const greeting: string = "Hello from SharpTS!";
const version: number = 1.0;
console.log(`${greeting} v${version}`);

const languages = ["TypeScript", "C#", ".NET"];
languages.forEach(lang => console.log(`  ✓ ${lang}`));
输出
Hello from SharpTS! v1
  ✓ TypeScript
  ✓ C#
  ✓ .NET

想运行你自己的代码?打开演练场 ↓

SharpTS 适合哪些场景

在这些具体场景里,.NET 上的 TypeScript 比转向 Node——或者 C#——更划算。

面向 .NET 团队的脚本与自动化

用 TypeScript 编写构建脚本、开发工具和一次性自动化任务,完整的 BCL 随手可用——机器上已经装有 .NET SDK,不需要任何 Node 工具链。没有 package.json,没有构建步骤:让 sharpts 指向文件即可。

终端
sharpts rotate-logs.ts

把 TypeScript 逻辑作为 .NET 库发布

将 TypeScript 模块编译为真正的程序集,并作为带版本号的 NuGet 包发布。借助引用程序集,C# 调用方可以实例化你的类、以完整类型调用你的方法。

终端
sharpts --compile pricing.ts --ref-asm
sharpts --compile pricing.ts --pack

让 TypeScript 开发者参与 .NET 代码库

让以 TypeScript 为主的同事用他们最熟悉的语言参与开发。借助 SharpTS.Sdk,他们的 .ts 文件与周围的 C# 项目在同一个 dotnet build 中编译——同一套工具链,同一条 CI 流水线。

app.csproj
<Project Sdk="SharpTS.Sdk/1.0.0">
  <PropertyGroup>
    <TargetFramework>net10.0</TargetFramework>
    <SharpTSEntryPoint>src/main.ts</SharpTSEntryPoint>
  </PropertyGroup>
</Project>

自包含的命令行工具

编译为单个自包含可执行文件,无需单独安装运行时——目标机器上不需要 Node,工具旁边也不用附带 node_modules 文件夹。

终端
sharpts --compile tool.ts -t exe
./tool

工作原理

从源代码到执行的多阶段流水线

源代码词法分析器解析器类型检查器解释器IL 编译器
了解工作原理

交互式演练场

编写 TypeScript 并在 .NET 上运行 —— 就在你的浏览器中

输出
点击“运行”或按 Ctrl+Enter 执行

支持范围

简要了解目前可用的 TypeScript 语言和运行时功能。有关实测详情,请查看规范一致性。

日常 TypeScript

SharpTS 工作流支持类、泛型、联合类型、装饰器、模块、async/await 以及现代类型系统功能。

标准运行时

可使用常见的 Array、String、集合、Promise、Date、RegExp、JSON、Symbol 和类型化数组 API。

软件包与 Node.js

裸导入以及软件包的 exports/imports 可以解析,但软件包仍需使用 SharpTS 兼容的语法和运行时 API。提供 TypeScript 源码的软件包最适合。

已知限制

Proxy 和 WeakRef 尚未实现。在规范边缘用例中,解释器与 AOT 的结果也可能不同。

常见问题

大家最先问到的问题——直截了当地回答。

SharpTS 和 tsc 有什么不同?

tsc 对代码做类型检查后生成 JavaScript,交给 Node 这样的引擎去运行。SharpTS 从不生成 JavaScript:它对同样的 TypeScript 做类型检查,然后要么直接执行,要么编译为 .NET 程序集。整条链路中没有 Node。安装脚本会在 .NET SDK 可用时使用它,否则安装独立运行版本。

为什么不嵌入 Jint 或 ClearScript 这样的 JavaScript 引擎?

那些项目在 .NET 宿主中运行的是无类型的纯 JavaScript——非常适合小型嵌入式脚本。SharpTS 运行的是 TypeScript 本身,执行前经过类型检查,并提供嵌入式 JS 引擎做不到的能力:预先编译为 IL、打包 NuGet,以及 TypeScript 与 C# 之间的双向类型化互操作。

可以使用 npm 包吗?

部分支持。裸导入通过 node_modules 解析;在受支持的模块解析模式下,也可处理软件包的 exports/imports 和条件目标。但软件包仍可能因 SharpTS 不支持的语法、原生插件、浏览器全局变量或缺失的运行时 API 而无法运行。提供 TypeScript 源码的软件包最适合。

查看 Node.js 兼容性进度 →
它快吗?

两种模式的答案不同。解释器以遍历语法树的方式执行,为即时启动而调优——适合脚本和 REPL,不适合数值密集计算。编译模式生成的 IL 由 CLR 像任何 C# 程序集一样即时编译,作为原生 .NET 代码运行。两种模式下,类型都在前期检查后被擦除——运行时零开销。

SharpTS 有多成熟?

这是一个采用 MIT 许可证、正在积极开发的年轻项目。上方的兼容性概览总结了常用功能,实测规范一致性提供详细依据,STATUS.md 则跟踪实现缺口。

在 STATUS.md 中关注进展 →

快速开始

三步即可上手

1

安装

运行安装脚本,为此计算机安装合适的 SharpTS 版本

curl -fsSL https://sharpts.dev/setup.sh | sh
2

编写

创建一个 TypeScript 文件

hello.ts
interface Config {
    name: string;
    debug: boolean;
}

const config: Config = { name: "MyApp", debug: true };
console.log(`Starting ${config.name}...`);
3

运行

直接解释执行,或编译为 .NET 程序集

终端
# 解释执行(瞬间启动)
sharpts hello.ts

# 编译为 .NET 程序集
sharpts --compile hello.ts -o hello