Angular是用Typescript构建的。因此在学习Angular之前有必要了解一下Typescript。

[ 类型 ]

Typescript增加了类型系统,好处是:

  1. 有助于代码编写,预防在编译期出现的bug

  2. 有助于代码阅读,更清晰的表现代码意图

如:

var name: string = 'Jay';            // 定义一个string类型的变量 name

在声明函数时,也可以为函数参数和返回值指定类型:

function greetText(name: string): string { return "Hello" + name; }

[ 内置类型 ]

字符串:string

var name : string = 'Felia'

数字:number

var age : number = 36

布尔类型:boolean

var married : boolean = true

数组:Array

可以用Array<type>或者type[]语法来为数组条目指定元素类型:

var jobs : Array<string> = ['IBM' , 'Microsoft' , 'Google'];
var jobs : string[] = ['IBM' , 'Microsoft' , 'Google'];

enum

枚举是一组可命名数值的集合。比如,如果想拿到某人的一系列角色,可以这么写:

enum Role {Employee, Manager, Admin};
var role : Role = Role.Employee;

默认情况下,枚举类型的初始值是0。可以调整初始值。

enum Role {Employee = 3, Manager, Admin};
var role : Role = Role.Employee;

枚举中其他项的值是依次递增的,这意味着 Role.Manager的值为4,Role.Admin的值为5。

还可以从枚举的值来反查它的名称:

enum Role {Employee, Manager, Admin};
console.log('Roles:',Role[0],',',Role[1],'and',Role[2]);

any类型

如果没有为变量指定类型,那它的默认类型就是any。在typescript中,any类型的变量可以接受任意类型的数据:

var something : any = 'as string';
something = 1;
something = [1,2,3];

"无"类型

void 意味着我们不期望那里有类型。它通常用作函数的返回值,表示没有任何返回值:

function setName(name : string) : void {
this.name = name;
}

[ 类 ]

用 class 关键字来定义一个类:class Vehicle {  } 。类可以包含属性、方法以及构造函数。

属性

属性定义了类实例对象的数据。比如叫Person的类可能有first_name、last_name和age属性。Person类的声明是这样的:

class Person {
first_name : string;
last_name : string;
age : number;
}

方法

方法是运行在类对象实例上下文中的函数。在调用对象的方法之前,必须要有这个对象的实例。

如果我们希望问候某个Person,就可以这样写:

class Person {
first_name : string;
last_name : string;
age : number; greet() {
console.log("Hello", this.first_name);
}
}

如果没有显式声明过方法的返回类型和返回值,就会假定它可能返回任何东西。

调用greet方法之前,我们要有一个Person类的实例对象:

var p : Person;
p = new Person();
p.first_name = 'Felipe';
p.greet();

我们还可以将对象的声明和实例化缩写为一行代码:

var p : Person = new Person();

假设我们希望Person类有一个带返回值的方法。比如,要获取某个Person在数年后的年龄,我们可以这样写:

class Person {
first_name : string;
last_name : string;
age : number; greet() {
console.log("Hello", this.first_name);
} ageInYears(years : number) : number {
return this.age + years;
}
}
var p : Person = new Person();
p.age = 6;
p.ageInYears(12); // -> 18

构造函数

构造函数是当类进行实例化时执行的特殊函数,必须命名为constructor。因为构造函数是在类被实例化时调用的,所以它们可以有输入参数但不能有任何返回值。

当没有显式地定义构造函数时,将自动创建一个无参构造函数:

class Vehicle{}
var v = new Vehicle();

它等价于:

class Vehicle {
constructor(){ }
}
var v = new Vehicle();

在Typescript中,每个类只能有一个构造函数。

我们可以使用带参数的构造函数来将对象的创建工作参数化:

class Person {
first_name: string;
last_name: string;
age: number;
constructor(first_name: string, last_name: string, age: number) {
this.first_name = first_name;
this.last_name = last_name;
this.age = age;
}
greet() {
console.log("Hello", this.first_name);
}
ageInYears(years: number): number {
return this.age + years;
}
}

用下面这种方法重写前面的例子要容易些:

var p: Person = new Person('Felipe', 'Coury', 36);
p.greet();

当创建这个对象的时候,其姓名、年龄都会被初始化。

继承

继承表明子类能够从父类得到它的行为。然后,我们就可以在这个子类中重写、修改以及添加行为。

继承是TypeScript的核心语法,并不像ES5那样要靠原型链实现,用extends关键字实现。
为了说明这一点,我们创建一个Report类:

class Report {
data: Array<string>;
constructor(data: Array<string>) {
this.data = data;
}
run() {
this.data.forEach(function(line) { console.log(line); });
}
}

实例化这个类,并且调用run方法:

var r: Report = new Report(['First line', 'Second line']);
r.run();

// First line
  // Second line

为了复用Report类的行为,要使用extends关键字来继承它:

class TabbedReport extends Report {
headers: Array<string>;
constructor(headers: string[], values: string[]) {
super(values)
this.headers = headers;
}
run() {
console.log(this.headers);
super.run();
}
}
var headers: string[] = ['Name'];
var data: string[] = ['Alice Green', 'Paul Pfifer', 'Louis Blakenship'];
var r: TabbedReport = new TabbedReport(headers, data);
r.run(); // First line
// Second line

[ 工具 ]

胖箭头函数

胖箭头(=>)函数是一种快速书写函数的简洁语法。

var data: string[] = ['Alice Green', 'Paul Pfifer', 'Louis Blakenship'];
data.forEach( (line) => console.log(line) );

当只有一个参数时,圆括号可以省略。箭头(=>)语法可以用作表达式:

var evens = [2,4,6,8];
var odds = evens.map(v => v + 1);

也可以用作语句:

data.forEach( line => {
console.log(line.toUpperCase())
});

=>语法还有一个重要的特性,就是它和环绕它的外部代码共享同一个this。

这是它和普通function写法最重要的不同点。通常,我们用function声明的函数有它自己的this。有时在JavaScript中能看见如下代码:

var nate = {
name: "Nate",
guitars: ["Gibson", "Martin", "Taylor"],
printGuitars: function() {
var self = this;
this.guitars.forEach(function(g) {
// this.name is undefined so we have to use self.name
console.log(self.name + " plays a " + g);
});
}
};

由于胖箭头会共享环绕它的外部代码的this,我们可以这样改写:

var nate = {
name: "Nate",
guitars: ["Gibson", "Martin", "Taylor"],
printGuitars: function() {
this.guitars.forEach( (g) => {
console.log(this.name + " plays a " + g);
});
}
};

模板字符串

ES6引入了新的模板字符串语法,它有两大优势:
  1. 可以在模板字符串中使用变量(不必被迫使用+来拼接字符串);
  2. 支持多行字符串。

字符串中的变量

这种特性也叫字符串插值(string interpolation)。你可以在字符串中插入变量,做法如下:

var firstName = "Nate";
var lastName = "Murray";
var greeting = `Hello ${firstName} ${lastName}`;
console.log(greeting); // Hello Nate Murray

注意,字符串插值必须使用反引号,不能用单引号或双引号。

多行字符串

var template = `
<div>
<h1>Hello</h1>
<p>This is a great website</p>
</div>
`

Angular:了解Typescript的更多相关文章

  1. 翻译:Angular 2 - TypeScript 5 分钟快速入门

    原文地址:https://angular.io/docs/ts/latest/quickstart.html Angular 2 终于发布了 beta 版.这意味着正式版应该很快就要发布了. 让我们使 ...

  2. Angular为什么选择TypeScript?

    原文地址:https://vsavkin.com/writing-angular-2-in-typescript-1fa77c78d8e8 本文转自:http://www.chinacion.cn/a ...

  3. VS Code 折腾记 - (5) Angular 2+ && Typescript 2 + 必备插件推荐

    前言 说起来我会用VSCode,有很大一方面是因为工作需求[以前主力工具是Atom],刚好公司的前端技术栈是NG2+TS2;对于喜欢折腾的我,裸奔的VSCODE是不可以接受的.so-. eg: vsc ...

  4. 【转载】在Angular 2/Typescript中声明全局变量的最佳方式是什么?

    问题详细描述 我想在Typescript语言中的Angular 2中声明一些全局可见的变量.最佳的实践方法是? 推荐的实现方法 这是最简单的解决方案,无需使用Service或Observer: 将全局 ...

  5. 【Angular】——TypeScript之胖箭头(=>)函数

    前言:胖箭头(=>)函数是一种快速书写函数的简介语法. ES5和TypeScript比较:在ES5中,每当我们要用甘薯作为方法参数时,都必须用function关键字和紧随其后的花括号({})表示 ...

  6. VS Code 调试 Angular 和 TypeScript 的配置

    一.安装插件 在 Visual Studio Code 中打开扩展面板(快捷键 Ctrl+Shift+X),搜索安装 Debugger for chrome 插件). 二.配置启动参数 在 Visua ...

  7. Angular for TypeScript 语法快速指南 (基于2.0.0版本)

    引导 import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; platformBrowserDynami ...

  8. TypeScript 5 Angular 2

    TypeScript 5 分钟快速入门 翻译:Angular 2 - TypeScript 5 分钟快速入门 原文地址:https://angular.io/docs/ts/latest/quicks ...

  9. Node.js && Angular && TypeScript 环境安装与更新

    安装 Node.js 下载并安装Node.js Angular 执行命令 npm install -g @angular/cli 参考资料: angular quickstart TypeScript ...

  10. Angular 2的12个经典面试问题汇总(文末附带Angular测试)

    Angular作为目前最为流行的前端框架,受到了前端开发者的普遍欢迎.不论是初学Angular的新手,还是有一定Angular开发经验的开发者,了解本文中的12个经典面试问题,都将会是一个深入了解和学 ...

随机推荐

  1. leetCode 36.Valid Sudoku(有效的数独) 解题思路和方法

    Valid Sudoku Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku bo ...

  2. 用eclipse 检索SVN 上 myEclipse 建的web项后,成java项目解决方法

    用eclipse 检索SVN 上 myEclipse 建的web项后,成java项目解决方法 在网上找了非常多,都无论用. 说添加.project 文件几个属性.但我发现里面都有,在我这里无论什么用. ...

  3. 深入理解Struts2

    简单介绍 Struts 2是Struts的下一代产品.是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架. 其全新的Struts 2的体系结构与Struts 1的 ...

  4. vue29-vue2.0组件通信_recv

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. centos 6.5搭建Samba

    Samba共享服务器 先将selinux关闭和防火墙端口号打开 #iptables -A INPUT -p udp -dport -j ACCEPT #iptables -A INPUT -p udp ...

  6. js 判断浏览器是否滚动到底部

    //jquery 实现代码 $(document).height() == $(window).height() + $(window).scrollTop() 1 整个空间的高度 包含(滚动条距离顶 ...

  7. javaScript 立即执行函数学习笔记

    立即执行函数: 即执行函数(Immediate Functions),立即执行函数模式是一种语法,可以让你的函数在定义后立即被执行 立即执行函数(immediate function)术语不是在ECM ...

  8. SGU 323 Aviamachinations

    Aviamachinations Time Limit: 4500ms Memory Limit: 65536KB This problem will be judged on SGU. Origin ...

  9. Timus 1935. Tears of Drowned 具体解释

    Old Captain Jack Sparrow's friend Tia Dalma, the fortuneteller and prophetess, often makes potions. ...

  10. Bmob移动后端云服务平台--Android从零開始--(一)何为Bmob

    Bmob移动后端云服务平台--Android从零開始--(一)何为Bmob 在正式的项目开发中,单client不能满足我们的需求,须要实现client与服务端的连接. 而在编写Android服务端代码 ...