以编程方式在C#中编译打字稿?

我正在尝试在C#中编写一个函数,该函数接收包含typescript代码的字符串并返回包含JavaScript代码的字符串。 这有库函数吗?

您可以使用Process调用编译器,将--out file.js指定到临时文件夹并读取已编译文件的内容。

我做了一个小应用程序来做到这一点:

用法

 TypeScriptCompiler.Compile(@"C:\tmp\test.ts"); 

获取JS string

 string javascriptSource = File.ReadAllText(@"C:\tmp\test.js"); 

完整源代码和评论:

 using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { try { // compiles a TS file TypeScriptCompiler.Compile(@"C:\tmp\test.ts"); // if no errors were found, read the contents of the compile file string javascriptSource = File.ReadAllText(@"C:\tmp\test.js"); } catch (InvalidTypeScriptFileException ex) { // there was a compiler error, show the compiler output Console.WriteLine(ex.Message); } Console.ReadKey(); } } public static class TypeScriptCompiler { // helper class to add parameters to the compiler public class Options { private static Options @default; public static Options Default { get { if (@default == null) @default = new Options(); return @default; } } public enum Version { ES5, ES3, } public bool EmitComments { get; set; } public bool GenerateDeclaration { get; set; } public bool GenerateSourceMaps { get; set; } public string OutPath { get; set; } public Version TargetVersion { get; set; } public Options() { } public Options(bool emitComments = false , bool generateDeclaration = false , bool generateSourceMaps = false , string outPath = null , Version targetVersion = Version.ES5) { EmitComments = emitComments; GenerateDeclaration = generateDeclaration; GenerateSourceMaps = generateSourceMaps; OutPath = outPath; TargetVersion = targetVersion; } } public static void Compile(string tsPath, Options options = null) { if (options == null) options = Options.Default; var d = new Dictionary(); if (options.EmitComments) d.Add("-c", null); if (options.GenerateDeclaration) d.Add("-d", null); if (options.GenerateSourceMaps) d.Add("--sourcemap", null); if (!String.IsNullOrEmpty(options.OutPath)) d.Add("--out", options.OutPath); d.Add("--target", options.TargetVersion.ToString()); // this will invoke `tsc` passing the TS path and other // parameters defined in Options parameter Process p = new Process(); ProcessStartInfo psi = new ProcessStartInfo("tsc", tsPath + " " + String.Join(" ", d.Select(o => o.Key + " " + o.Value))); // run without showing console windows psi.CreateNoWindow = true; psi.UseShellExecute = false; // redirects the compiler error output, so we can read // and display errors if any psi.RedirectStandardError = true; p.StartInfo = psi; p.Start(); // reads the error output var msg = p.StandardError.ReadToEnd(); // make sure it finished executing before proceeding p.WaitForExit(); // if there were errors, throw an exception if (!String.IsNullOrEmpty(msg)) throw new InvalidTypeScriptFileException(msg); } } public class InvalidTypeScriptFileException : Exception { public InvalidTypeScriptFileException() : base() { } public InvalidTypeScriptFileException(string message) : base(message) { } } } 

也许您可以使用像JavaScriptDotNet这样的JavaScript解释器来运行C#中的typescript编译器tsc.js。

就像是:

 string tscJs = File.ReadAllText("tsc.js"); using (var context = new JavascriptContext()) { // Some trivial typescript: var typescriptSource = "window.alert('hello world!');"; context.SetParameter("typescriptSource", typescriptSource); context.SetParameter("result", ""); // Build some js to execute: string script = tscJs + @" result = TypeScript.compile(""typescriptSource"")"; // Execute the js context.Run(script); // Retrieve the result (which should be the compiled JS) var js = context.GetParameter("result"); Assert.AreEqual(typescriptSource, js); } 

显然,代码需要一些认真的工作。 如果这确实可行,我肯定会对结果感兴趣。

您可能还想修改tsc以便它可以在内存中的字符串上运行,而不是需要文件IO。

TypeScript编译器文件正式运行在node.js或Windows Script Host上 – 它是用TypeScript本身编写的(并转换为JavaScript)。 它需要一个可以访问文件系统的脚本宿主。

基本上,只要您可以将其包装在支持所需文件系统操作的脚本引擎中,您就可以从任何语言运行TypeScript。

如果你想纯粹用C#编译TypeScript到JavaScript,你最终会编写一个编译器的C#克隆。