1 为什么TypeScript
动态类型和静态类型
- 动态类型语言在执行阶段才去进行类型检查,如:JavaScript、Python
- 静态类型在编译阶段做类型检查,如:Java、TypeScript
弱类型与强类型
- 弱类型语言:不同类型的变量可以混合计算。弱类型语言是一种弱类型定义的语言,某一个变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过现行强制转换。
- 强类型语言:不管在编译时还是运行时,一旦某个类型赋值给某个变量,它会持有这个类型,并且不能同其他类型在计算某个表达式时混合计算。即一旦某一个变量被定义类型,如果不经强制转换,那么它永远就是该数据类型。
- JavaScript:动态类型、弱类型语言
- TypeScript:静态类型、弱类型语言(会进行类型转换)
静态类型的优势:
- 可读性增强:基于语法解析TSDoc,ide增强
- 可维护性增强:在编译阶段暴露大部分错误
2 基本语法
2.1 基本类型
- Number
- String
- Boolean
- Undefined
- Null
- BigInt(ES6)
- Symbol(ES6)
- any:ts特有的一个类型,表示所有类型,任何类型。
/*字符串*/
const q:string = 'string';
/*数字*/
const w:number = 1;
/*布尔值*/
const e:boolean = true;
/*null*/
const r:null = null;
/*undefined*/
const t:undefined = undefined;
2.2 对象类型
-
- 使用interface(接口)来定义对象类型。
- readonly:表示只读属性,表示属性不可以在对象初始化之外进行赋值
- ?:可选属性,表示属性可以存在也可以不存在
2.3 函数类型
可采用接口interface形式定义函数类型
interface IMult {
(x: number, y: number): number
}
const mult: IMult = (x, y) => x * y
2.3.1 函数重载
2.4 数组类型
/*「类型+方括号」表示*/
type IArr1 = number[];
/*泛型表示*/
type IArr2 = Array<string | number | Record<string, number>>;
/*元祖表示*/
type IArr3 = [number, number, string, string] ;
/*接口表示*/
interface IArr4 {[key: number] : any;}
const arr1: IArr1 = [1, 2, 3, 4, 5, 6];
const arr2: IArr2 = [1, 2, '3', '4', {a: 1}];
const arr3: IArr3 = [1, 2, '3', '4'];
const arr4: IArr4 = ['string', () => null, {}, []];
2.5 泛型
/*泛型接口&多泛型*/
interface IX<T, U> {
key: T;
val: U;
}
/*泛型类*/
class IMan<T> { instance: T; }
/*泛型别名*/
type ITypeArr<T> = Array<T>;
2.5.1 泛型约束
使用泛型的时候,可以使用泛型约束来将泛型限制在一定范围内。使用extends关键字,限制泛型的类型。
/*泛型约束:限制泛型必须符合字符串*/
type IGetRepeatStringArr = <T extends string>(target: T) => T[];
const getStrArr: IGetRepeatStringArr = target => new Array(100).fill(target);
/*报错:类型"number"的参数不能赋给类型"string”的参数*/
getStrArr(123);
2.5.2 泛型参数默认类型
泛型可以使用=
来设置默认的类型。
/*泛型参数默认类型*/
type IGetRepeatArr<T = number> = (target: T) => T[];
const getRepeatArr: IGetRepeatArr = target => new Array(100).fill(target);
/*报错:类型"string"的参数不能赋给类型“number"的参数*/
getRepeatArr('123')
3 高级类型
- 联合类型:|,联合类型表示一个值可以是几种类型之一。
- 交叉类型:&,多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性。
- 类型保护与类型守卫