在我们2020年的开发者调查结果中,最受关注的统计数据之一是最受欢迎的语言。就像几年来的情况一样,铁锈是第一位的。但排在第二位的是TypeScript,这是一个强类型的JavaScript超集,以微弱优势领先于Python。我们想找出是什么让Tyescript如此惹人喜爱,所以我们联系了Ryan Cavanaugh,他是微软打字语言的主要工程负责人。他很慷慨地坐下来回答我们的问题。没有更多的麻烦,这里是我们的对话,为清晰起见稍微编辑了一下。
答:2012年2月,在我们最初发布之前大约六个月,我开始在打字团队工作。所以我已经研究了大约八年了。
问:很有趣,非常接近开头。你还记得团队为什么拿出打字稿,你为什么要发布这样的东西吗?
答:当我加入团队时,微软有很多人想要开发我们所说的“应用程序规模”的JavaScript。像TFS和Office这样的团队想要构建大型JavaScript应用程序。这些人中的很多人都熟悉静态类型语言--C++、C#、Java,诸如此类的东西。他们希望静态类型既可用于概念可伸缩性,也可用于工具。
微软的语言专家看着情况说,好吧,我们可以试着写一种新的语言,就像人们以前做的那样。有像Script#这样的项目,它将C Sharp转换成JavaScript,或者像CoffeeScript这样的语言说,如果JavaScript有不同的语法会怎么样?但他们决定只使用JavaScript,并在上面添加静态类型。
当时,JavaScript正在经历增长的复兴,在相当长的一段时间里,他们再次为该语言添加了功能。人们想要使用那些很酷的新功能,比如箭头函数和类,他们不想等待所有的浏览器都采用它们。他们希望能够立即使用这些功能。我认为TypeScript首先提供了三个功能:用于错误查找的静态类型、利用静态类型信息进行工具开发以及提供明天和今天的JavaScript功能。
问:你有没有看到过领养点一去不复返?有没有什么东西出现了,人们会说,哦,是的,我们现在做打字了?
答:哦,肯定是谷歌宣布他们将使用带角度的字体。现在这有点浪费在时间上了。但如果你看一下TypeScript的图表,从字面上看任何图表-GitHub明星、下载量、拉取请求-你都能看到那个角度公告出来的确切时间点。然后图表就会改变。它永远不会回头。你再也看不到曲线上的那个小弯了,因为曲线一直在走。那是一个真正的转折点。我认为有趣的是,当时人们认为排版只会是人们使用的棱角分明的字体,而不会有太多其他的东西。事实证明并非如此。很明显,我们在有棱角的DEVS中还是很受欢迎的。但这对我们来说是一个真正的动力建立者。
问:在我们最新的开发者调查中,打字是第二大最受欢迎的语言,排名上升。你认为人们为什么这么喜欢它呢?
答:从根本上说,JavaScript作为一种语言声名狼藉,但实际上使用它相当有趣。它能让你时而充满活力,时而更具目的性。这只是一种很棒的函数式语言。但是,缺少静态类型检查确实限制了人们在运行之前编写他们确信会起作用的代码的能力。
TypeScript巩固了JavaScript的最后一个粗糙优势,为您提供了一些使用起来非常有趣的东西,并且可以随时随地运行。我认为,如果TypeScript是一种建立在一种不太通用的语言或一种不那么有趣的语言之上的语言,我认为它不会那么成功。它真的是接受了一些伟大的东西,并让它变得更好。
问:看起来静态输入现在有点流行。我看到了很多关于欣赏Rust中的鸭子类型的评论,Python中的提示。你认为静态打字现在这么流行的原因是什么?
答:我认为这是因为人们试图在没有它的情况下构建大型应用程序,并看到了这是多么痛苦。我的意思是,同样的事情也发生在Facebook的Hack身上,他们正在向PHP添加类型。所以我想人们已经意识到,你可以很容易地编写一个没有静态键入的小程序,但你很快就会达到一个门槛,如果没有它,事情就会变得太痛苦。当你试图维护它们和猜测打字之类的事情时,很难推理。
我想我最喜欢看到的是互联网上的人们说,‘我用打字稿做了这个巨大的重构,我重构了三个小时。然后我运行我的代码,它第一次就起作用了。在动态语言中,这是永远不会发生的。当类型检查器说您完成时,将会有一个非常令人满意的元素。这可能只有85%的准确率。但这总比零好多了。这只是一种更好的开发方式,特别是在这样的大型重构期间。
问:我看到一些人抵制静态类型。你认为有没有更具活力的打字位置?
答:我想是的。我是说,外面是个很大的编程世界。我认为你不喜欢静态类型没有错。我想这是个人喜好。当然,在某些程序中,静态输入会阻碍您的工作。这对我们来说很重要;我们还为JavaScript提供了工具,我们仍然认为JavaScript是一种完全有效的开发方式。我只想告诉人们,如果静态类型不适合您,无论是您的编程风格还是您正在处理的问题,都可以跳过它。那没问题。没关系的。我不会被冒犯的。如果有人能得到一个三万行的应用程序,并且不用静态类型就能完成工作,我会印象非常深刻。这看起来真的很难。不过,还是要表扬那些让它发挥作用的人。
蟒蛇也是一样的。很少有人拥有可用的Python类型批注,但是Python非常流行。我认为这些数据不言而喻--我认为Python在调查中排名第三。注:是这样的,但差一点就到了)。我向您保证,这些Python开发人员中只有很小一部分拥有静态类型。无论您的问题领域是什么,它都可能是最适合您的。
问:我知道我们即将迎来Java诞生25周年。JavaScript也已经和我们在一起有一段时间了。现在是打字稿了。在过去的十年里,我们看到的趋势是什么,从离线工作到在Web上工作,再到在移动设备上工作,使得JavaScript和现在的打字成为如此令人向往的工具?
答:我认为这只是一种平台效应。如果有任何一种编程语言可以在每台机器上和浏览器中运行,那将是当今最流行的编程语言。我的意思是,我高度评价JavaScript,但老实说,我认为它起飞并进入浏览器,然后进入桌面和服务器的事实-这就是整个比赛。我不认为这与语言有任何关系,这只是它的位置。
问:是的,学习一种无论你在哪里都能使用的语言的能力,除非你是一名在政府系统或其他系统上工作的COBOL开发人员。
答:是的。我认为云是其中的一个重要方面,在这里你需要运行Linux平台、Windows平台和Mac的代码。许多编程语言都试图有意提供跨平台执行,但都以失败告终。也许本质上不是失败,但没有得到你想要的理解。JavaScript从底层开始-或者可能是上层-作为一种只在浏览器中工作的非常高级的语言,然后一直向下发展,直到它成为可以在较低级别运行并与文件系统交互的东西。
问:那么,你们打字团队的人是如何保持打字作为一种受人喜爱的语言的呢?
答:我们总是关注用户反馈告诉我们什么,人们要求什么,关注JavaScript生态系统中流行的库是什么。所有这些都帮助我们找出下一个要添加到语言中的正确功能是什么。
VUE正在兴起并即将到来。真的有太多东西要列出来了。但随着不同的UI框架或底层数据操作库变得越来越流行,我们需要确保该语言能够表示这些框架或底层数据操作库。GraphQL正在变得流行起来。那么,我们的类型系统能准确地表达您需要用GraphQL做的事情吗?那里有空隙吗?
我们只想确保我们真实地代表了JavaScript生态系统,因为最终,如果人们想要使用很酷的新JavaScript技术,但它在TypeScript上不能很好地工作,他们会在放弃JavaScript之前放弃TypeScript,对吗?这就是你在这里的原因。您想要编写执行任务的程序,而不仅仅是满足类型检查器的要求。所以我认为这对我们来说是最重要的。
但我们也想非常有目的地发展。流行的编程语言,就像你说的,现在已经有二十五、三十五、三十五年的历史了。我们已经上八年级了。如果我们只有四分之一的功能是我们真正需要的,我们仍然在前进。
问:大多数情况下,打字脚本会被转换成JavaScript。对于德诺来说,它是一种一流的语言。你对这样的努力有什么看法?你认为浏览器会先做打字吗?
A:德诺超酷。我很高兴有人建造了这项技术,并正在观察它会发生什么。我认为浏览器案例真的很有趣,因为它看起来很有意义。然后,每次我往前走五步,我的大脑就完全崩溃了。
所以对我来说,这就像是,好的,你要给客户提供打字稿。然后客户就可以翻译打字稿了。嗯,如果您不想对您发送的文件进行类型检查,那么就没有意义了。剥离类型注释是一个非常机械的过程,没有太大的价值。您可以向下发送源代码映射或其他任何东西,但这更像是一种诊断调试器体验。所以我们进入这种模式,我们把它作为打字稿发送下来,这样客户就可以检查它的类型了。
我的第一个问题是,为什么这是客户的工作?因为您将此打字代码推送到服务器,我希望它会在您这样做的时候进行输入检查。如果没有,想想你为什么要这么做就很奇怪了。再说一次,开发场景在这里完全是另一回事。我希望看到在开发空间上有更多的投资,这样的问题是,拥有这样的空间是否更有意义?
但不管怎样,假设我们继续检查客户端的类型。嗯,在您拉入所有依赖项之前,您不能真正开始这个类型检查过程。然后,您最终会向下发送实际上不会做任何事情的.d.ts文件。那么.d.ts文件是怎么进入你的服务器的呢?
我不会说这永远不会发生,但我认为有更大的空间来使用像你在`Create-Reaction-App`中看到的那样的技术,它有一个实时的Web服务器用于开发,在它提供动态转换的JavaScript时,会在后台检查类型。这是一个很棒的模型,它使我所有的反对意见完全没有意义,因为类型检查是在一个更符合逻辑的时间进行的。也许有一些空间可以用来安装浏览器插件。但是这个模型也有点令人困惑,因为最终您的`<;scripts>;`标记将拉入一个.js文件,除非所有的浏览器突然都支持TypeScript。这就是你必须要做的。
现在的问题是您是否在调试或加载(比方说)引用.js文件的生产HTML。在这个过程中,我们实际上是从哪里获得.ts文件的呢?永不言败。但对我来说,这是一种不太快的情况。Deno完全是它自己的东西,因为它是一个新的运行时。所以这个场景对我来说更有意义,至少在您第一次运行脚本时进行类型检查,并确保您有一些兼容的环境。
问:微软团队目前的状况如何?自从你加入以来,它增长了多少,规模有多大?
答:在我们一直致力于这个问题的整个过程中,我们有四到八名核心编译器工程师,一到两个PM,以及四到零名专门的测试人员。这是相当稳定的。最近我们更有意识地发展了团队。
在历史上,我们有一个核心编译器团队,然后另一个团队负责Visual Studio方面的工作,因为集成到像Visual Studio这样的大型产品被证明是一项相当大量的工作。但VS一侧的一些架构改进释放了那里的一些工程师力量。所以我们请来了那个团队来帮助我们进行重构和定义之类的事情。总体团队规模相同,只是现在我们会有更多的人从事核心编译器服务的工作,您可以在GitHub repo上看到这一点。
问:你能给我一点关于微软之外的观点吗?你看到哪里有人帮助你以不同的方式构建这个系统?我们谈到了Deno,以及它对打字脚本的作用。你认为其他人在哪里帮助建立这个生态系统?
我们完全依赖于生态系统来制造在集成环境中工作的产品。所以无论是webpack还是像ts-loader这样的插件,或者我们是如何使用ROLLUP、PARCEL或…的。给你的捆绑者起个名字,对吗?这一切都很复杂。
我们的员工水平不足以让我们完全拥有这种体验。我们也不想这么做。社区应该推动TypeScript如何融入到这些更大的构建过程中,以及作为一个整体的更大的生态系统中。随着JavaScript构建管道的扩展和变得更加复杂,我们看到人们正在加紧提供该功能。这可以是TypeScript和`Create-Reaction-app`,也可以是TypeScript如何与Vue之类的东西集成。我们只是想确保我们正在建造只有我们自己知道如何建造的东西,然后用只有他们知道如何建造的东西来帮助别人。在几个里程碑之前,我们专门与ts-loader人员合作,以便在那里获得一个好的项目引用实现。
JavaScript生态系统中的事物数量不断增加。与其壮大团队,我们只是希望扩大社区,使其在所有这些场景中都能支持TypeScript。我们也一直在研究如何才能更聪明地将外部稿件输入到打字稿中。我们看到的主要挑战是,向TypeScript代码库添加功能实际上很容易,而修复bug却非常困难。人们更喜欢添加功能,而不是修复错误,因为这很有趣。谁能怪他们呢?弄清楚我们可以为此做些什么,并鼓励人们在我们需要更多帮助的事情上帮助我们,这将是一个社区挑战。我不会出去说我需要更多免费的工作。人们可以带着他们在这里提供的任何东西来开源。太好了。但这是我更愿意有意识地去做的事情。
标签:公告、堆叠溢出、打字脚本