这里列举了两个主要的目的javascript
你获取想知道为何要给javascript添加类型系统呢?java
类型系统已经被证实是一种能够加强代码质量和可读性的能力,大型团队(例如谷歌,微软,facebook)都在印证着这个结论,更具体点说:git
typescript会尽可能保持一个低门槛,来保证开发者能够低成本的学习编写ts代码github
typescript为js提供了编译时的类型检查,最棒的是类型彻底是可选的,你的js代码(.js文件)能够重命名成(.ts)文件,typescript一样会返回和原有js文件同样的输出。经过可选的类型检查,typescript就是严格的js超集。算法
在代码开发阶段,typescript会尽量用比较低的成本去推断尽量多的类型信息,例如,在接下来的例子中,typescript将会知道foo是number类型,当在第二行代码中又给foo赋值为一个字符串类型的值时,就会报出错误typescript
var foo = 123;
foo = '456'; // Error: cannot assign `string` to `number`
复制代码
这种类型推断具备良好的动机,若是你也有像上述例子类似的场景,在接下来的代码中,并不肯定foo究竟是number类型仍是string类型,这样的问题在大型的多文件代码库中常常能碰到,咱们稍后会继续深刻了解类型推断的规则。安全
根据咱们在以前提到的,typescript将会尽能安全的进行类型的推断,然而,也可使用注解去明确达到下面两个目的函数
typescript是用尾随式的类型注解学习
var foo: number = 123;
复制代码
下面这个例子编译器将会抛出一个errorthis
var foo: number = '123'; // Error: cannot assign a `string` to a `number`
复制代码
咱们会在后续章节讨论注解语法的细节
在typescript中,咱们想让js开发者以更小的学习成原本编写ts代码,因此类型都是结构化的,这意味着,”鸭子类型“是一种类(class)语言优先的结构,考虑下面这个例子,函数iTakePoint2D将会接收任何包含了x和y的对象做为参数
interface Point2D {
x: number;
y: number;
}
interface Point3D {
x: number;
y: number;
z: number;
}
var point2D: Point2D = { x: 0, y: 10 }
var point3D: Point3D = { x: 0, y: 10, z: 20 }
function iTakePoint2D(point: Point2D) { /* do something */ }
iTakePoint2D(point2D); // exact match okay
iTakePoint2D(point3D); // extra information okay
iTakePoint2D({ x: 0 }); // Error: missing information `y`
复制代码
为了使js代码迁移到ts代码更为简单,即便是有编译错误,默认的,typescript也会触发有效的js代码使其正常执行
var foo = 123;
foo = '456'; // Error: cannot assign a `string` to a `number`
复制代码
等价于触发下面这段js代码
var foo = 123;
foo = '456';
复制代码
因此从js代码过渡到ts代码能够采用逐渐更新升级的策略,这也是ts不一样于其余语言编译器工做以及迁移到ts的缘由
typescript的一个主要的设计目标就是能够在typescript尽量简单和安全的使用已经存在的js库,typescript经过声明(declaration)来达到这个目的,typescript提供了一个可变的比例针对你想在声明文件中放置多少声明信息,声明的越具体,类型检测和代码提示就越详细,注意,针对大多数流行的js库已经有写好的声明文件[github.com/borisyankov…](DefinitelyTyped community), 因此针对大多数的目的:
为了快速定义一个本身的声明文件,以jQuery为例,默认的,在你使用一个变量以前,typescript都指望你首先要声明它
$('.awesome').show(); // Error: cannot find name `$`
复制代码
为了快速解决这个问题,你能够告诉typescript,这里确实有一个叫作$的家伙
declare var $: any;
$('.awesome').show(); // Okay!
复制代码
若是你想基于这个基础的定义来提供更多的信息以防止出现编译error,能够这样作
declare var $: {
(selector:string): any;
};
$('.awesome').show(); // Okay!
$(123).show(); // Error: selector needs to be a string
复制代码
typescript提供了不少新特性针对当前的js引擎,typescript团队也在积极的添加这些特性,这份特性列表也会随着时间变得愈来愈丰富,这里以一个class为例。
class Point {
constructor(public x: number, public y: number) {
}
add(point: Point) {
return new Point(this.x + point.x, this.y + point.y);
}
}
var p1 = new Point(0, 10);
var p2 = new Point(10, 20);
var p3 = p1.add(p2); // { x: 10, y: 30 }
复制代码