日常 TypeScript
SharpTS 工作流支持类、泛型、联合类型、装饰器、模块、async/await 以及现代类型系统功能。
面向 .NET 的 TypeScript 解释器和 AOT 编译器
既可作为脚本运行以即时获得反馈,也可编译为原生 .NET 程序集——并能完整访问 .NET 生态系统。
curl -fsSL https://sharpts.dev/setup.sh | shirm https://sharpts.dev/setup.ps1 | iex// 直接在 .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.编写在 .NET 运行时上运行的 TypeScript——可解释执行以快速迭代,也可编译为原生 .NET 程序集。
让 SharpTS 指向一个 .ts 文件即可运行——无需构建步骤,无需配置。非常适合脚本、自动化以及在 REPL 中尝试想法。
预先编译为真正的 .NET 程序集——DLL、自包含可执行文件或 NuGet 包——以原生 CLR 速度运行。
通过 @DotNetType 从 TypeScript 调用 .NET 库,并从 C# 使用你编译后的 TypeScript。复用 BCL、NuGet 包以及你已有的代码。
使用熟悉的 TypeScript,包括泛型、类、装饰器、异步、模块等;代码运行前会进行类型检查。请参阅下方的实用兼容性概览。
将 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
interface Comparable<T> { compareTo(other: T): number; }
class Temperature implements Comparable<Temperature> {
constructor(private celsius: number) {}
get fahrenheit(): number { return this.celsius * 9 / 5 + 32; }
compareTo(other: Temperature): number { return this.celsius - other.celsius; }
toString(): string { return `${this.celsius}°C (${this.fahrenheit}°F)`; }
}
const temps = [new Temperature(100), new Temperature(0), new Temperature(37)];
temps.sort((a, b) => a.compareTo(b));
temps.forEach(t => console.log(t.toString()));0°C (32°F) 37°C (98.6°F) 100°C (212°F)
async function delay(ms: number): Promise<string> { return `Done after ${ms}ms`; }
async function main() {
console.log(await delay(100));
const all = await Promise.all([delay(50), delay(100), delay(150)]);
all.forEach(result => console.log(result));
}
main();Done after 100ms Done after 50ms Done after 100ms Done after 150ms
const data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const result = data.filter(n => n % 2 === 0).map(n => n ** 2).reduce((sum, n) => sum + n, 0);
console.log(`Sum of squares of evens: ${result}`);
const [first, second, ...rest] = data;
console.log(`First: ${first}, Second: ${second}`);
console.log(`Rest: [${rest.join(", ")}]`);Sum of squares of evens: 220 First: 1, Second: 2 Rest: [3, 4, 5, 6, 7, 8, 9, 10]
console.log(`PI = ${Math.PI}`);
console.log(`E = ${Math.E}`);
console.log(`sqrt(144) = ${Math.sqrt(144)}`);
const now = new Date("2026-03-02T12:00:00.000Z");
console.log(`ISO: ${now.toISOString()}`);
const obj = { name: "SharpTS", nums: [1, 2, 3] };
console.log(`JSON: ${JSON.stringify(obj)}`);PI = 3.141592653589793
E = 2.718281828459045
sqrt(144) = 12
ISO: 2026-03-02T12:00:00.000Z
JSON: {"name":"SharpTS","nums":[1,2,3]}// Full CLI interop (the public playground intentionally disables module loading)
@DotNetType("System.Text.StringBuilder")
declare class StringBuilder {
constructor();
append(value: string): StringBuilder;
toString(): string;
}
@DotNetType("System.TimeSpan")
declare class TimeSpan {
static fromHours(value: number): TimeSpan;
readonly totalMinutes: number;
}
const sb = new StringBuilder();
sb.append("1.5 hours = ");
sb.append(`${TimeSpan.fromHours(1.5).totalMinutes} minutes`);
console.log(sb.toString());1.5 hours = 90 minutes
在这些具体场景里,.NET 上的 TypeScript 比转向 Node——或者 C#——更划算。
用 TypeScript 编写构建脚本、开发工具和一次性自动化任务,完整的 BCL 随手可用——机器上已经装有 .NET SDK,不需要任何 Node 工具链。没有 package.json,没有构建步骤:让 sharpts 指向文件即可。
sharpts rotate-logs.ts将 TypeScript 模块编译为真正的程序集,并作为带版本号的 NuGet 包发布。借助引用程序集,C# 调用方可以实例化你的类、以完整类型调用你的方法。
sharpts --compile pricing.ts --ref-asm
sharpts --compile pricing.ts --pack让以 TypeScript 为主的同事用他们最熟悉的语言参与开发。借助 SharpTS.Sdk,他们的 .ts 文件与周围的 C# 项目在同一个 dotnet build 中编译——同一套工具链,同一条 CI 流水线。
<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编写 TypeScript 并在 .NET 上运行 —— 就在你的浏览器中
简要了解目前可用的 TypeScript 语言和运行时功能。有关实测详情,请查看规范一致性。
SharpTS 工作流支持类、泛型、联合类型、装饰器、模块、async/await 以及现代类型系统功能。
可使用常见的 Array、String、集合、Promise、Date、RegExp、JSON、Symbol 和类型化数组 API。
裸导入以及软件包的 exports/imports 可以解析,但软件包仍需使用 SharpTS 兼容的语法和运行时 API。提供 TypeScript 源码的软件包最适合。
Proxy 和 WeakRef 尚未实现。在规范边缘用例中,解释器与 AOT 的结果也可能不同。
大家最先问到的问题——直截了当地回答。
tsc 对代码做类型检查后生成 JavaScript,交给 Node 这样的引擎去运行。SharpTS 从不生成 JavaScript:它对同样的 TypeScript 做类型检查,然后要么直接执行,要么编译为 .NET 程序集。整条链路中没有 Node。安装脚本会在 .NET SDK 可用时使用它,否则安装独立运行版本。
那些项目在 .NET 宿主中运行的是无类型的纯 JavaScript——非常适合小型嵌入式脚本。SharpTS 运行的是 TypeScript 本身,执行前经过类型检查,并提供嵌入式 JS 引擎做不到的能力:预先编译为 IL、打包 NuGet,以及 TypeScript 与 C# 之间的双向类型化互操作。
部分支持。裸导入通过 node_modules 解析;在受支持的模块解析模式下,也可处理软件包的 exports/imports 和条件目标。但软件包仍可能因 SharpTS 不支持的语法、原生插件、浏览器全局变量或缺失的运行时 API 而无法运行。提供 TypeScript 源码的软件包最适合。
查看 Node.js 兼容性进度 →两种模式的答案不同。解释器以遍历语法树的方式执行,为即时启动而调优——适合脚本和 REPL,不适合数值密集计算。编译模式生成的 IL 由 CLR 像任何 C# 程序集一样即时编译,作为原生 .NET 代码运行。两种模式下,类型都在前期检查后被擦除——运行时零开销。
这是一个采用 MIT 许可证、正在积极开发的年轻项目。上方的兼容性概览总结了常用功能,实测规范一致性提供详细依据,STATUS.md 则跟踪实现缺口。
在 STATUS.md 中关注进展 →三步即可上手
运行安装脚本,为此计算机安装合适的 SharpTS 版本
curl -fsSL https://sharpts.dev/setup.sh | shirm https://sharpts.dev/setup.ps1 | iex创建一个 TypeScript 文件
interface Config {
name: string;
debug: boolean;
}
const config: Config = { name: "MyApp", debug: true };
console.log(`Starting ${config.name}...`);直接解释执行,或编译为 .NET 程序集
# 解释执行(瞬间启动)
sharpts hello.ts
# 编译为 .NET 程序集
sharpts --compile hello.ts -o hello