TypeScript非常棒。它是强类型和快速开发的完美结合,所以它非常容易使用,在很多情况下我会默认使用这个库。然而,没有一种语言是完美的,在某些情况下TypeScript并不是最适合的:性能至关重要(例如实时通信、视频游戏)与本地代码(例如C/C++或Rust)的交互需要更严格的类型系统(例如金融系统)对于这些情况,TypeScript开发人员最好选择其他语言。C#、Go、Java都是非常不错的选择。它们比TypeScript快得多,并且每种语言都有自己的长处。C#与TypeScript配合得很好,让我解释一下原因。TypeScript是添加了C#的JavaScript。C#与TypeScript配合得很好,因为它们看起来像是同一种语言。两者都是由AndersHejlsberg设计的,并且在很多方面,TypeScript是添加了C#的JavaScript。它们的特性和语法相似,因此很容易将它们组合在同一个项目中。更重要的是,C#这门语言与TypeScript非常相似,因此开发者阅读和编写代码都非常容易。相比之下,Go是一门完全不同的语言:没有类,没有继承,没有异常,没有包级别的封装(只有类级别的封装),语法也完全不同。当然,这不一定是坏事,但开发者确实需要重新思考和设计不同的代码,因此同时使用Go和TypeScript会更加困难。然而,Java与C#非常相似,但仍然缺少C#和TypeScript具有的许多功能。C#和TypeScript的相同点也许你已经知道C#和TypeScript有很多相似之处,比如基于C的语法、类、接口、泛型等。下面,让我详细列出两者的相似点:async/awaitlambda表达式以及用于处理空运算符(?、!、??)的函数式数组方法解构命令行界面(CLI)async/await首先,C#和JavaScript都使用async/await来处理异步代码。在JavaScript中,异步操作由Promises表示,应用程序可以等待异步操作的完成。C#中的Promise其实就是Task,和Promise在概念上完全相同,都有相应的方法。以下示例演示了两种语言中async/await的用法:asyncfunctionfetchAndWriteToFile(url:string,filePath:string):Promise{//fetch()returnssaPromiseconstresponse=awaitfetch(url);consttext=awaitresponse.text();//顺便说一下,我们正在使用Deno(https://deno.land)awaitDeno.writeTextFile(filePath,text);returntext;}usingSystem.IO;usingSystem.Net.Http;usingSystem.Threading.Tasks;asyncTaskFetchAndWriteToFile(stringurl,stringfilePath){//HttpClient.GetAsync()returnsaTaskvarresponse=awaitnewHttpClient().GetAsync(url);vartext=awaitresponse.Content.ReadAsStringAsync();awaitFile.WriteAllTextAsync(filePath,text);returntext;}下面是JavaScriptPromiseAPI和等效的C#TaskAPI:Lambda表达式和函数式数组方法C#和JavaScript都使用熟悉的=>语法(即箭头函数)来表示lambda表达式。这是TypeScript和C#之间的比较:constmonths=['January','February','March','April'];constshortMonthNames=months.filter(month=>month.length<6);constmonthAbbreviations=months.map(month=>month.substr(0,3));constmonthStartingWithF=months.find(month=>{returnmonth.startsWith('F');});TypeScript使用lambda表达式usingSystem.Collections.Generic;usingSystem.Linq;varmonths=newList{"January","February","March","April"};varshortMonthNames=months.Where(month=>month.Length<6);varmonthAbbreviations=months.Select(month=>month.Substring(0,3));varmonthStartingWithF=months.Find(month=>{returnmonth.StartsWith("F");});在C#中使用lambda表达式上面的例子演示了C#的System.Linq命名空间的一些方法等同于JavaScript的函数式数组方法。以下是JavaScript的数组方法和等效的C#Linq方法:性能:C#速度很快。C#的ASP.NETWeb框架始终位居Techempower基准测试榜首,而C#的.NETCoreCLR运行时的性能随着每个主要版本的提高而提高。C#具有出色性能的原因之一是通过使用结构而不是类,应用程序可以最大限度地减少甚至消除垃圾收集。因此,C#在视频游戏编程中非常流行。游戏和混合现实:C#是最流行的游戏开发语言之一,被Unity、Godot甚至Unreal等游戏引擎使用。C#在混合现实中也很流行,因为VR和AR应用程序都是用Unity编写的。因为C#有第一方库、工具和文档,所以有些任务很容易实现,例如用C#创建gRPC客户端比TypeScript方便得多。相反,在Node.js中使用TypeScript时,需要找出正确的模块和工具组合,以正确生成JavaScriptgRPC客户端和相应的TypeScript类型。高级特性:C#有很多其他语言没有的特性,比如运算符重载、析构函数等,前面说过,没有完美的语言。设计语言时总是需要权衡取舍,因此有些语言速度更快但更难使用(例如Rust的借用检查)。另一方面,有些语言非常好用,但通常性能优化比较困难(比如JavaScript的动态语言特性)。这就是为什么我相信拥有一组相似的语言是有用的:每种语言都有自己的优势,但相似并且可以很好地协同工作。例如,这里有一组我选择的语言:TypeScript最高级别的语言,最快的开发时间不是最好的性能,但适合大多数应用程序不太适合与原生代码集成C#仍然是一种高级语言,支持垃圾回收,所以它很容易使用,虽然不如TypeScript简单。在速度和内存使用方面,其性能优于TypeScript。最重要的是可以和底层很好的结合。C++开发难度更大(比如需要手动内存管理),所以开发速度会慢很多但是运行时会快一些。最棒的表演!并且无处不在,可以与很多现有的软件相结合。很像C#,标准库很好,但是有很多陷阱(主要与内存管理有关)。我更喜欢使用Rust,因为它有更好的内存安全性,但我的很多工作将与现有的C++代码结合,因此使用C++更容易。