今天也好喜欢你啊。
写这篇的时候,也满脑子的你。
2020/02/18
一
1.TypeScript 只会进行静态检查,如果发现有错误,编译的时候就会报错,但仍会生成js文件
如果要在报错的时候终止 js 文件的生成,可以在 tsconfig.json 中配置 noEmitOnError 即可
二
1.JavaScript 的类型分为两种:原始数据类型和对象类型。
原始数据类型包括:布尔值、数值、字符串、null、undefined 以及 ES6 中的新类型 Symbol。
在 TypeScript 中,boolean 是 JavaScript 中的基本类型,而 Boolean 是 JavaScript 中的构造函数。其他基本类型(除了 null 和 undefined)一样
eg:
let isDone: boolean = false; 编译通过
let createdByNewBoolean: boolean = new Boolean(1);或者 let createdByNewBoolean: Boolean = new Boolean(1); 编译不通过,因为返回的是一个 Boolean 对象
2.Void、undefined 和 null
在 TypeScript 中,可以用 void 表示没有任何返回值的函数;
声明一个 void 类型的变量没有什么用,因为你只能将它赋值为 undefined 和 null;
undefined 和 null 是所有类型的子类型。也就是说 undefined 和 null类型的变量,可以赋值给其他变量;void不行
eg:
let num: number = undefined; 编译通过
3.any类型
允许被赋值为任意类型;
变量如果在声明的时候,未指定其类型,那么它会被识别为任意值类型;
eg:
let something;
something = 'seven';
something = 7; 编译通过,因为类型推论将something认为any
eg:
let myFavoriteNumber = 'seven';
myFavoriteNumber = 7; 编译不通过,因为类型推论将myFavoriteNumber认为string
4.联合类型
当不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法
eg:
let myFavoriteNumber: string | number;
5.interface
它是对行为的抽象,而具体如何行动需要由类(classes)去实现(implement);接口一般首字母大写;
一旦定义了任意属性,那么确定属性和可选属性都必须是它的子属性
eg:
interface Person {
name: string;
age?: number;
}
name属性必须有,age可以没有,除了这两个不允许有其他属性。
eg:
interface Person{
name: string;
age?: number;
[propName: string]: any;
}
使用 [propName: string] 定义了任意属性取 string 类型的值。
let tom: Person = {
name: 'Tom',
gender: 'male'
};
eg:
interface Person {
readonly id: number;
name: string;
age?: number;
[propName: string]: any;
}
let tom: Person = {
id:1,
name: 'Tom',
gender: 'male'
};
只读属性在第一次给对象赋值时也要赋值,只是后面不能修改
tom.id = 89757; 会编译失败
6.数组(待续)
数组: let fibonacci: number[] = [1, 1, 2, 3, 5];
数组泛型: let fibonacci: Array<number> = [1, 1, 2, 3, 5];
7.函数
在 TypeScript 的类型定义中,=> 用来表示函数的定义,左边是输入类型,需要用括号括起来,右边是输出类型;
与ES6中的 => 完全不同
eg:
let mySum = function (x: number, y: number): number {
return x + y;
};
与
let mySum: (x: number, y: number) => number = function (x: number, y: number): number {
return x + y;
};
前者利用类型推论推断出mySum的类型
允许可选参数,用 “?”表示,但可选参数必须在必须参数之后
eg:
function buildName(firstName?: string, lastName: string) {
...
}
允许参数默认值,TypeScript 会将添加了默认值的参数识别为可选参数;此时就不受「可选参数必须接在必需参数后面」的限制了
eg:
function buildName(firstName: string = 'Tom', lastName: string) {
...
}
剩余参数,使用 “...rest”方式
eg:
function push(array, ...items) {
....
}
允许函数重载
TypeScript 会优先从最前面的函数定义开始匹配,所以多个函数定义如果有包含关系,需要优先把精确的定义写在前面
8.断言
当不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法。此时可以使用类型断言,将该变量“转换”为联合类型中的一个;
断言成一个联合类型中不存在的类型是不允许的
eg:
function getLength(something: string | number): number {
if ((<string>something).length) {
return (<string>something).length;
} else {
return something.toString().length;
}
}