CoffeeScript 是几年前第一个出现在我面前的JavaScript转译语言,但是在使用了一段时间之后,我放弃了继续使用它。
诚然CoffeeScript使大家更容易的使用JavaScript,但是不像JavaScript,并没有很多的开发人员使用它,它的语法结构也和JavaScript有很大的区别,所有学习CoffeScript需要投入大量的时间和精力,学习曲线将非常的陡峭。
我并没有攻击CoffeeScript意思,同样的事情发生在所有的类似的语言身上(这里所说的类似的语言是指需要使用某种编译器将语言翻译成浏览器理解的语言的语言)。对于这些语言,因为他们大多数是开源的,所以他们可能引入大量的不想后兼容的修改。当然对于传统的编译语言,也可能发生相似的问题,但是在大部分时候他们都相当的问题,并且被一群有着丰富经验的开发人员维护着。
当近期Angular 2开始浮出水面的时候,我注意到Angular 2推荐使用TypeScript进行系统的开发,而且所有的官方例子也是基于TypeScript开发的。作为一个Angular 1的粉丝,我决定把我的成见放在一旁,开始学习Angular 2系统选择的TypeScript。
JavaScript是一门纯动态语言,对某些人来说这是一个福音,但是对有些人来说就是一个噩梦(动态语言给开发人员带来巨大好处的同时,也对开发人员提出了更高的要求)。在JavaScript的开发过程中,当团队规模超过1人的时候,很容易就产生混乱的代码。TypeScript的目标就是让开发人员能够更好的管理类型和参数。
在多年的C#开发过程中,我一直纠结于定义正确的类型和接口是否是必须的。通过定义正确的类型和接口,最重要的事情就是让你可以很容易的替换实现(因为所有的调用接口都是一致的),而这一点,从理论上来说,将会在测试和开发过程中节省大量的时间。
让我们通过下面这个简单的"Shapes"例子来了解一下TypeScript的相关知识。在我们的例子中,每个Shape都是一个多边形,所以我们创建了一个IPolygon接口,这个接口定义了我们在这个例子中需要用到的关于多边形的所有信息。
import { Color } from "../Color"; export interface IPolygon { name: string; fill: Color; stroke: Color; toString(): string; draw(): void; }
下面我们将创建一个正方形对象,这个对象实现了IPolygon接口:
import { IPolygon } from "./IPolygon"; import { Color } from "../Color"; export class Square implements IPolygon { name = "Square"; fill = Color.Black; stroke = Color.Red; width = 0; height = 0; constructor(size: number) { this.width = size; this.height = size; } toString() { return this.height + "px " + this.width + "px"; } draw() { } }
你可能注意到了上面的代码中引用了Color对象,这个对象存在的目的在于设置一些可以被外部程序使用的静态变量:
export class Color { hexCode: string; constructor(hexCode: string) { this.hexCode = hexCode; } static Red: Color = new Color("#f00"); static Black: Color = new Color("#000"); }
接下来我们创建了一个"canvas"对象,我们可以在这个对象上画任何的IPolygon对象。"canvas"对象提供了一个draw方法,这个方法将调用所有加入到canvas对象中的IPolygon对象的draw方法。
import { ICanvas } from "./ICanvas"; import { IPolygon } from "./shapes/IPolygon"; export class NullCanvas implements ICanvas { items: IPolygon[]; constructor() { this.items = []; } draw() { for (let i = 0; i < this.items.length; i++) { let item = this.items[i]; item.draw(); } } add(item: IPolygon) { this.items.push(item); } }
从C#程序员的角度看,这段TypeScript代码基本已经是面向对象的风格了,但是从一个JavaScript程序员的角度看,这段代码和以前的JavaScript代码完全不一样,至少和ES6之前的JavaScript代码完全不一样。经过一个下午的学习,我渐渐喜欢上了TypeScript语言,已经如何用它来书写代码。
现在回到我一开始的问题上:是否值得花时间学习TypeScript?我目前还无法说服自己使用TypeScript,特别是ES6也提供了类似的功能。但是对于一个大的团队来说,TypeScript提供的类型安全将给所有的开发人员带来巨大的好处,但是对于一个小规模的项目,我觉得ES6已经足够好的提供了一种标准的应用开发流程。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务