复习typescrript,从入门开始。
类型
一、原始类型
原始数据类型包括:布尔值、数值、字符串、null、undefined 以及 ES6 中的新类型 Symbol。
- 布尔值 (boolean)
let isDone: boolean = false;
- 数值 (number)
let decLiteral: number = 6;
let hexLiteral: number = 0xf00d; // ES6 中的二进制表示法
let binaryLiteral: number = 0b1010; // ES6 中的八进制表示法
let octalLiteral: number = 0o744;
- 字符串 (string)
let myName: string = 'Tom';
let myAge: number = 25;
- 空值 (null | undefined) (void)
JavaScript 没有空值(Void)的概念,在 TypeScript 中,可以用 void 表示没有任何返回值的函数:
function alertName(): void {
alert('My name is Tom');
}
null和undefined
let u: undefined = undefined;
let n: null = null;
任意值 any
如果是一个普通类型,在赋值过程中改变类型是不被允许的,但如果是 any 类型,则允许被赋值为任意类型。
let myFavoriteNumber: any = 'seven';
myFavoriteNumber = 7;
联合类型
联合类型(Union Types)表示取值可以为多种类型中的一种。
联合类型使用 | 分隔每个类型
let myFavoriteNumber: string | number;
myFavoriteNumber = 'seven';
myFavoriteNumber = 7;
let myFavoriteNumber: string | number;
myFavoriteNumber = true;
对象的类型 --接口
在面向对象语言中,接口(Interfaces)是一个很重要的概念,它是对行为的抽象,而具体如何行动需要由类(classes)去实现(implement)。
TypeScript 中的接口是一个非常灵活的概念,除了可用于对类的一部分行为进行抽象以外,也常用于对「对象的形状(Shape)」进行描述。
interface Person {
name: string;
age: number;
}
let tom: Person = {
name: 'Tom',
age: 25
};
可选属性
有时我们希望不要完全匹配一个形状,那么可以用可选属性
interface Person {
name: string;
age?: number;
}
let tom: Person = {
name: 'Tom'
};
interface Person {
name: string;
age?: number;
}
let tom: Person = {
name: 'Tom',
age: 25
};
任意属性
一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集
interface Person {
name: string;
age?: number;
[propName: string]: any;
}
let tom: Person = {
name: 'Tom',
gender: 'male'
};
只读属性 readonly (注意,只读的约束存在于第一次给对象赋值的时候,而不是第一次给只读属性赋值的时候)
interface Person {
readonly id: number;
name: string;
age?: number;
[propName: string]: any;
}
let tom: Person = {
id: 89757,
name: 'Tom',
gender: 'male'
};
数组的类型
-
「类型 + 方括号」来表示数组
let fibonacci: number[] = [1, 1, 2, 3, 5]; -
数组泛型 (我们也可以使用数组泛型(Array Generic) Array 来表示数组)
let fibonacci: Array = [1, 1, 2, 3, 5]; -
接口表示数组
interface NumberArray { [index: number]: number; } let fibonacci: NumberArray = [1, 1, 2, 3, 5]; //NumberArray 表示:只要索引的类型是数字时,那么值的类型必须是数字。 -
类数组
事实上常用的类数组都有自己的接口定义,如 IArguments, NodeList, HTMLCollection 等:
function sum() { let args: { [index: number]: number; length: number; callee: Function; } = arguments; }其中 IArguments 是 TypeScript 中定义好了的类型,它实际上就是:
interface IArguments { [index: number]: any; length: number; callee: Function; }关于内置对象,可以参考内置对象一章。
- any在数组中的应用
let list: any[] = ['xcatliu', 25, { website: 'http://xcatliu.com' }];
函数的类型
-
函数声名
function sum(x: number, y: number): number { return x + y; } -
函数表达式
let mySum = function (x: number, y: number): number { return x + y; }; -
接口定义函数的形状
interface SearchFunc { (source: string, subString: string): boolean; } let mySearch: SearchFunc; mySearch = function(source: string, subString: string) { return source.search(subString) !== -1; }可选参数 (可选参数后面不允许再出现必需参数了)
function buildName(firstName: string, lastName?: string) { if (lastName) { return firstName + ' ' + lastName; } else { return firstName; } } let tomcat = buildName('Tom', 'Cat'); let tom = buildName('Tom');默认参数
function buildName(firstName: string, lastName: string = 'Cat') { return firstName + ' ' + lastName; } let tomcat = buildName('Tom', 'Cat'); let tom = buildName('Tom');剩余参数
function push(array: any[], ...items: any[]) { items.forEach(function(item) { array.push(item); }); } let a = []; push(a, 1, 2, 3);