一 基础类型(有null和undefinded吗)
1、布尔值:同js
let isDone: boolean = false;
2、数字:所有数字都是浮点数,支持二进制,八进制,十进制,十六进制
let decLiteral: number = 6;
let hexLiteral: number = 0xf00d;
let binaryLiteral: number = 0b1010;
let octalLiteral: number = 0o744;
3、字符串:支持模版字符串
let name: string = "bob";
4、数组:
let list: number[] = [1, 2, 3];
let list: Array<number> = [1, 2, 3]; // 数组范型
5、元组(Tuple):元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同
let x: [string, number];
当访问一个越界的元素,会使用联合类型替代
6、枚举类型(enum):
enum Color {Red=0, Green=1, Blue=2}
let c: Color = Color.Green;
c = Color[1]; // Green
7、Any:任意类型
8、void:没有任何类型
function warnUser(): void { // 没有返回值
console.log("This is my warning message");
}
let unusable: void = undefined|null;
9、Null和Undefined
当你指定了--strictNullChecks标记,null和undefined只能赋值给void和它们各自。
10、Never:无法到达的重点,不存在的类型
// 返回never的函数必须存在无法达到的终点
function error(message: string): never {
throw new Error(message);
}
// 推断的返回值类型为never
function fail() {
return error("Something failed");
}
// 返回never的函数必须存在无法达到的终点
function infiniteLoop(): never {
while (true) {
}
}
11、Object:非原始类型,也就是除number,string,boolean,symbol,null或undefined之外的类型。
12、类型断言:
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length; // 我知道someValue一定是string,所以不用检查类型了,直接掉用length属性吧;
let strLength: number = (someValue as string).length; // 同上,jsx语法支持
二 变量声明 es6的内容
三 接口
1、概念及示例:
interface LabelledValue { // LabelledValue是接口的名字,这个接口定义了一个约束,它代表了有一个 label属性且类型为string的对象
label: string;
}
function printLabel(labelledObj: LabelledValue) {
console.log(labelledObj.label);
}
let myObj = {size: 10, label: "Size 10 Object"};
printLabel(myObj);
2、可选属性:
interface SquareConfig {
color?: string;
width?: number;
}
3、只读属性:只能在刚创建的时候赋值
interface Point {
readonly x: number;
readonly y: number;
}
/* TypeScript具有ReadonlyArray<T>类型,它与Array<T>相似,只是把所有可变方法去掉了,因此可以确保数组创建后再也不能被修改:*/
let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray<number> = a;
ro[0] = 12; // error!
ro.push(5); // error!
ro.length = 100; // error!
a = ro; // error!
/* 上面代码的最后一行,可以看到就算把整个ReadonlyArray赋值到一个普通数组也是不可以的。 但是你可以用类型断言重写: */
a = ro as number[];
readonly vs const
最简单判断该用readonly还是const的方法是看要把它做为变量使用还是做为一个属性。 做为变量使用的话用 const,若做为属性则使用readonly。
4、额外的属性检查
如果你的参数中含有约束中没有的字段,他会提示你这个字段有可能是错误的,你可以通过一下两种方式来避免这种错误提示
1、interface SquareConfig {
color?: string;
width?: number;
[propName: string]: any; // 任意的其他字段
}
2、let squareOptions = { colour: "red", width: 100 };
let mySquare = createSquare(squareOptions); // 不使用对象字面量可以绕开这种检查
5、函数类型接口,只有参数列表和返回值类型的定义,没有实现
interface SearchFunc {
(source: string, subString: string): boolean;
}
let mySearch: SearchFunc;
mySearch = function(src: string, sub: string): boolean {
let result = src.search(sub);
return result > -1;
}
对于函数类型的类型检查来说,函数的参数名不需要与接口里定义的名字相匹配,只要对应位置桑的参数类型是兼容的
6、可索引的类型
7、类类型
8、
四 类
n、抽像类:在类的声明前加上abstract前缀,里面可以包含抽象方法也可以包含实例方法,但抽象方法前面必须加上关键字。
abstract class Department {
constructor(public name: string) {
}
printName(): void {
console.log('Department name: ' + this.name);
}
abstract printMeeting(): void; // 必须在派生类中实现
}
注意:在继承抽象类的时候,如果声明一个变量类型是抽象类型,但是示例化是派生类型,则这个对象不可调用派生类自己的方法。
2、把类当做接口使用
类可以定义类型,所以在js里接口也可以继承类
class Point {
x: number;
y: number;
}
interface Point3d extends Point {
z: number;
}
五、函数