TypeScript
数据类型 - 类型约束
基本数据类型
布尔值 - boolean
// 布尔值 Boolean true - false let isDone:boolean = true; // let isDone:Boolean = false;
数字 - number
// 数字 - 包括十进制,十六进制二进制,八进制数字 let num:number = 5;
字符串 - string
// 字符串 - 单引号或双引号包裹的字符,反引号包裹的模板字符串也是字符串 let str1:string = '单引号字符串'; let str2:string = "双引号字符串"; let str3:string = `"模板字符串"+${str1}+${str2}`; // 如果用模板字符串拼接的有其他数据类型,也将会传换为字符串 - 隐式类型转换 let num1:number = 20; let str4:string = `"模板字符串"+${num1}`;// 结果是:模板字符串20
null,undefined
// 官方解释说它们本身的类型用处不是很大 // 可能也确实如此,毕竟也不会闲着没事总去定义null,undefined吧,布尔值不比这香? // 不过还是要说一下的,它们的类型约束就是自身 let n:null = null; let u:undefined = undefined; // 值得一提的是,默认情况下null,undefined是所有类型的子类型。就是说你可以把 null和undefined赋值给number类型的变量。
引用数据类型
数组 Array - []
// 数组 两种写法 // 第一种 - 类型后面直接加[] let arr1:number[] = [1,2,3]; let arr2:string[] = ["1","2","3"]; // 第二种 - 使用数组泛型 - Array<元素类型> - 可以理解为数组包含的元素类型 let arr3:Array<number> = [4,5,6]; let arr4:Array<string> = ["4","5","6"]; // 对于再复杂的数组类型,请看下面的元组
非原始类型 - Object
// object表示非原始类型,也就是除number,string,boolean,symbol,null或undefined之外的类型。 // 声明创建一个create的函数,参数类型是object declare function create(o: object | null): void; create({ prop: 0 }); // OK create(null); // OK create(42); // Error create("string"); // Error create(false); // Error create(undefined); // Error除了上面那种用法之外,我们常见的还有别的。。。
// 字面量对象约束 let person:{name:string,age:number} = {name:"tom",age:18}; // 接口约束 - 可以使用接口来定义对象的结构,然后使用该接口来约束对象的类型 interface Person { name:string; age:number; } let person:Person = {name:"tom",age:18}; // 类约束 - 可以通过使用类来定义对象的结构,并通过实例化来约束对象的类型 class Personal { constructor(public name:string,public age:number){ // } } let person:Person = new Person("tom",18);
其他类型
元组Tuple - 混合类型约束
//元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同 let a:[string,number]; a=['hello',666]; // 如果你将位置调换,则会报错 b = [666,'hello'];// 报错 // 你也可以通过下标进行访问当前元素类型 console.log(a[0].substr(1));// 返回结果是对应的类型
void
// 表示没有任何类型 - 一个函数没有返回值时,你通常会见到其返回值类型是 void function fn():void{ console.log("这是一个没有返回值的函数") } //声明一个void类型的变量没有什么大用,因为你只能为它赋予undefined和null let unusable: void = undefined;
never - 表示用不存在的值类型
// never类型是任何类型的子类型,也可以赋值给任何类型 // 有类型是never的子类型或可以赋值给never类型(除了never本身之外) // 常用场景: // 1.作为函数返回类型 - 当函数抛出异常时,确保调用者知道该函数不会有返回值 function ErrFn(message:string):never{ throw new Error(message); } // 2.作为永远不会被赋值的变量类型 function fn():never { while(true){ // 无限循环 } }
any - 任何类型
//当我们不清楚变量的类型是可以使用any来指定。这些变量可能来自动态数据,用户输入,或者第三方代码库 let a:any = 4; a = "我可以是字符串"; a = false;//我可以是布尔值 // 还可以是任何类型any和object的区别
// Object类型的变量只是允许你给它赋任意值 - 不能调用方法 // any类型在允许你赋任意值的时候,还可以在上面调用方法 let a:any = 4.12345; a.toFixed(2);// 4.12 let o:Object = 4.12345; o.toFixed();// 报错
枚举 enum
//enum类型是对JavaScript标准数据类型的一个补充。 // 我们可以通过枚举类型来定义一个集合 enum Color { Red, Green, Blue } // 我们可以通过名称访问到下标值 let c:Color = Color.Green;// 结果是1 // 默认情况下是从0开始,你也可以改变开始值 enum Color { Red = 1, Green, Blue } let c:Color = Color.Green;// 结果是2 // 我们也可以通过枚举来定义一组常量集合 enum Val { name = "Tom", str = "hahaha" } let v:Val = Val.name;// Tom
枚举的成员值必须是数字字面量、字符串字面量或其他枚举成员。
类型断言
//当你比TypeScript更了解某个值的信息时,也就是说你告诉typescrip你知道你正在做什么,并且已经做了检查
// 两种形式
// 尖括号 <>
let val:any = "我是一段字符串";
let strLength:number = (<string>val).length;
// 如果你直接写成let strLength:number = val.length;则会报错,原因时any类型没有length方法
// as关键字
let val:any = "我是一段字符串";
let valLength:number = (val as string).lenght;
// 两种方式使用哪个都一样,不过当你使用jsx语法时只能使用as
学习ing。。。