Angular是用TypeScript编写的。在这篇文章中,我将讨论为什么我们作出决议。我还将分享我运用TypeScript的阅历:它如何影响我写和重构我的代码的方式。
TypeScript有很好的工具
TypeScript的最大的卖点就是工具。它提供初级自动完成,导航和重构。拥有这样的工具简直是大型项目的必备要求。没有他们,改动代码的恐惧使代码库处于半只读形状,并使大规模重构十分风险且昂贵。
TypeScript不是编译为JavaScript的独一类型言语。还有其他言语具有更强的类型系统,在实际上可以提供相对弱小的工具。但在实际中大少数人除了编译器之外没有其他的东西。这是由于构建丰厚的开发工具必须是第一天就明白的目的,它是针对TypeScript团队的。这就是为什么他们构建言语效劳,可以由运用的编辑器提供类型反省和自动完成。假设您想知道为什么有这么多编辑用具有很好的TypeScript支持,答案就是言语效劳。
智能感知和重构提示(例如:重命名变量)对代码编写进程和重构进程的重要性是不争的理想。虽然很难权衡,但我觉得如今之前要几天时间的重构可以在不到一天的时间内完成。
虽然TypeScript大大提高了代码编辑体验,但它使得开发人员设置愈加复杂,特别是与在页面上放置ES5脚本相比。此外,您不能运用剖析JavaScript源代码的工具(例如JSHint),但通常有足够的替代品。
TypeScript是JavaScript的超集
由于TypeScript是JavaScript的超集,因此您无需阅历少量重写即可迁移到JavaScript。你可以一个模块一个模块,逐渐的迁移。
只需选一个模块,将.js文件重命名为.ts,然后逐渐添加类型注释。完成一个模块之后,再挑选下一个重构模块。一旦编写了整个代码库,就可以末尾调整编译器设置,使其愈加严厉。
这个进程能够需求一些时间,但是关于Angular来说,这还不是最大的成绩。逐渐迁移的进程,可以让我们保持开发新功用的同时来修复转换进程中的bug。
TypeScript明白了笼统
一个好的设计是关于设计良好的接口。并且以支持它们的言语来表达接口的想法要容易得多。
例如,想象一个销售书籍的运用顺序,可以经过用户界面的注册用户或经过某种API的外部系统停止购置。
正如你所看到的,这两个类都扮演购置者的角色。虽然对运用极为重要,在代码中没有明晰的表达购置者的含义。没有名为buyeraser.js的文件。因此,有人能够会在不知道这段代码含义的状况下修正这个代码。
function processPurchase(purchaser, details){ }
class User { }
class ExternalSystem { }
只经过看代码来确定什么对象可以充任购置者的角色,这个角色有什么办法十分困难。我们不知道,我们不会从我们的工具中取得很多协助。我们必须人为推断这个信息,这很慢,容易出错。
如今,将其与我们明白定义购置者接口的版本停止比较。
interface Purchaser {id: int; bankAccount: Account;}
class User implements Purchaser {}
class ExternalSystem implements Purchaser {}
具有类型的版本可以清楚的表示,有一个购置者的接口,然后有两个类完成了这个接口。所以TypeScript接口允许我们定义笼统/协议/角色。
重要的是要看法到,TypeScript不会强迫我们引入额外的笼统。购置者笼统存在于JavaScript版本的代码中,但没有明白定义。
在静态类型的言语中,子系统之间的边界是运用接口定义的。由于JavaScript缺少接口,边界并没有在纯JavaScript中表达出来。不能清楚地看到边界,开发人员末尾依赖于详细的类型而不是笼统接口,这代码耦合度十分高。
在开发Angular的进程中,在转换到TypeScript之前和之后的任务阅历,坚决了我的想法。定义接口,强迫我去思索API的边界,协助我去定义子系统的接口,并且暴显露耦合的中央。
TypeScript使代码更容易阅读和了解
是的,我知道这看起来不直观。让我试着用一个例子来阐明我的意思。我们来看看这个函数jQuery.ajax()。们可以从签名中取得什么样的信息?
jQuery.ajax(url, settings)
我们独一可以确定的是该函数有两个参数。我们可以猜出这些类型。也许第一个是一个字符串,第二个是一个配置对象。但这仅仅是猜测,我们能够会错。我们不知道什么选项进入设置对象(他们的名字和类型),或许这个函数前往什么。
我们没有办法在不查看源码或许文档的状况下调用此函数。反省源代码不是一个好的选择 - 功用和类的要点是可以在不知道它们如何完成的状况下运用它们。换句话说,我们应该依托他们的接口,而不是依托它们的完成。我们可以反省文档,但它不是最好的开发人员体验 - 它需求更多的时间,文档往往是过时的。
所以虽然很容易读取jQuery.ajax(url,settings),要真正了解如何调用这个函数,我们需求读取它的源码或其文档。
如今,将其与类型版本比照
ajax(url: string, settings?: JQueryAjaxSettings): JQueryXHR;
interface JQueryAjaxSettings {
async?: boolean;
cache?: boolean;
contentType?: any;
headers?: { [key: string]: any; };
//...
}
interface JQueryXHR {
responseJSON?: any; //...
}
它给了我们更多的信息。
这个函数的第一个参数是一个字符串。
settings参数是可选的。我们可以看到可以传递给函数的一切选项,不只仅是它们的名字,还包括它们的类型。
该函数前往一个JQueryXHR对象,我们可以看到它的属性和函数。
(责任编辑:admin)