TypeScript非常优秀。它完美地结合了强类型和快速开发,因此非常好用,我在许多情况下都会默认选择这个库。但是,世上没有完美的语言,有些情况下TypeScript并不是最合适的工具:性能至关重要(例如实时通信、视频游戏)需要与原生代码(如CC或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的语法、类、接口、泛型等。下面,我来详细列举一下二者的相似之处:asyncawaitlambda表达式和函数式数组方法用于处理空的操作符(?,!,??)解构命令行界面(CLI) asyncawait 首先,C和JavaScript都使用asyncawait来处理异步代码。在JavaScript中,异步操作用Promise表示,而应用程序可以await一个异步操作结束。C中的Promise其实是Task,概念上与Promise完全相同,也有相应的方法。下面的例子演示了两种语言中asyncawait的用法:asyncfunctionfetchAndWriteToFile(url:string,filePath:string):Promisestring{fetch()returnsaPromiseconstresponseawaitfetch(url);consttextawaitresponse。text();Bytheway,wereusingDeno(https:deno。land)awaitDeno。writeTextFile(filePath,text);}usingSystem。IO;usingSystem。Net。HusingSystem。Threading。TasyncTaskstringFetchAndWriteToFile(stringurl,stringfilePath){HttpClient。GetAsync()returnsaTaskvarresponseawaitnewHttpClient()。GetAsync(url);vartextawaitresponse。Content。ReadAsStringAsync();awaitFile。WriteAllTextAsync(filePath,text);}下面是JavaScript的PromiseAPI与等价的CTaskAPI: JavaScriptAPI 等价的CAPI Promise。all() Task。WaitAll() Promise。resolve() Task。FromResult() Promise。reject() Task。FromException() Promise。prototype。then() Task。ContinueWith() newPromise() newTaskCompletionSource()Lambda表达式和函数式数组方法 C和JavaScript都用熟悉的语法(即箭头函数)来表示lambda表达式。下面是TypeScript和C的比较:constmonths〔January,February,March,April〕;constshortMonthNamesmonths。filter(monthmonth。length6);constmonthAbbreviationsmonths。map(monthmonth。substr(0,3));constmonthStartingWithFmonths。find(month{returnmonth。startsWith(F);}); TypeScript中使用lambda表达式usingSystem。Collections。GusingSystem。LvarmonthsnewListstring{January,February,March,April};varshortMonthNamesmonths。Where(monthmonth。Length6);varmonthAbbreviationsmonths。Select(monthmonth。Substring(0,3));varmonthStartingWithFmonths。Find(month{returnmonth。StartsWith(F);}); C中使用lambda表达式 上述示例演示了C的System。Linq命名空间中的一些方法,相当于JavaScript的函数式数组方法。下面是JavaScript的数组方法与等价的CLinq方法: JavaScriptAPI 等价的CAPI Array。prototype。filter() Enumerable。Where() Array。prototype。map() Enumerable。Select() Array。prototype。reduce() Enumerable。Aggregate() Array。prototype。every() Enumerable。All() Array。prototype。find() List。Find() Array。prototype。findIndex() List。FindIndex()性能:C很快。C的ASP。NETWeb框架一直在Techempower的评测中名列前茅,而C的。NETCoreCLR运行时的性能每个主要版本都在提高。C拥有优良性能的原因之一是,通过使用结构而不是类,应用程序可以最小化甚至完全消除垃圾回收。因此,C在视频游戏编程中非常流行。游戏和混合现实:C是游戏开发最流行的语言之一,像Unity、Godot甚至Unreal游戏引擎都使用了C。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会更容易。