摘要:# TypeScript介绍 ## 官方声明 > **JavaScript that scales。**TypeScript is a typed superset of JavaScript that compiles to plain JavaScript ## 特点 - 出自**Anders Hejlsberg**之手(C#,Delphi作者) - 兼容ES
TypeScript介绍
官方声明
JavaScript that scales。TypeScript is a typed superset of JavaScript that compiles to plain JavaScript
特点
出自**Anders Hejlsberg**之手(C#,Delphi作者)
兼容ES规范,同时也有自己的一些规范(如namespace)
自带编译器,也是TS写的
语言即服务(IDE,第三方库的方法声明等)
静态分析
输入错误
interfaceISort {name: string, age:number}functionsortByName(a: ISort[]) { var result = a.slice(0); result.sort((x, y) => {returnx.name.localCompare(y.name); });returnresult;}
执行tsc编译:
errorTS2339: Property 'localCompare' does not exist on type 'string'.
localCompare这种输入手误在没有智能提示的情况下是较为常见的,如果这个函数是原生JS,那会等到运行时才会报错。如果使用支持TS的IDE,则输入localCompare后会直接标红,避免运行时这块代码被执行到然后报错再Debug。
非空判断
function countLines(text?:string[]):number{ letcount=0;for(const lineoftext) {if(line && line.length!==0) {count=count+1; } }returncount;}
执行tsc编译:
errorTS2532: Object is possibly 'undefined'.
可以看到for (const line of text) {这行中的text变量是有可能为undefined的(?:是TS语法,表示存在不存在都有可能)。这种缺少非空判断到时的JS运行时错误在工作中也是容易出现的。
访问权限
classPerson{protectedname: string; public age: number; constructor(name: string) {this.name = name; }}classEmployeeextendsPerson{ static someAttr =1;privatedepartment: string; constructor(name: string, department: string) {super(name);this.department = department; }}let howard =newEmployee("Howard","Sales");console.log(howard.name);
执行tsc编译:
errorTS2445: Property 'name' is protected and only accessible within class 'Person' and its subclasses.
Person中name属性是protected类型,只能在自己类中或者子类中使用,这和Java是一样的。
interfaceMachine{ move():void}interfaceHuman{ run():void}classRobotimplementsMachine,Human{ run() { console.log('run'); }}
执行tsc编译:
error TS2420:Class'Robot'incorrectlyimplementsinterface'Machine'.Property'move'ismissingintype'Robot'.
Robot类实现多个接口时,必须实现每个接口的所有抽象方法,这也是实现多继承的一种方法。
扩展性
TS适合大规模JS应用,正如他的官方宣传语JavaScript that scales。
类型系统+静态分析+智能感知/提示,使大规模的应用代码质量更高,更好维护。
有类似VSCode这样配套的IDE支持,方便的查看引用关系,并进行重构,再也不用全局搜索,一个个修改了。
数据结构(应用配置、前后端接口等JSON格式数据)的类型校验,和强类型的后端配合更为无缝、健壮,方便后期前后端整体迭代、重构。
超集
由于兼容ES规范,所以可以比较方便的升级现有的JS代码,逐渐的加类型注解。渐进式(容我盗个词)增强代码健壮性。不过这个也是理论上的,我目前维护的一个项目有比较重的历史包袱,模块管理是CommonJS/ES6 Modules混杂的,我尝试将编译系统从Babel完全迁移到TS,折腾后并没有成功(Babel还是很强大的= =)。
对于历史包袱比较多的老项目,不建议完全替换Babel,但是可以曲线引入TS,用TS编译到ES6,再用Babel来编译到ES5。
原文链接