//string
// 使用 string表示文本数据类型。 和JS一样,可以使用双引号( ")、单引号(')和反引号(`)表示字符串。总之,和JS的玩法一样。
var names:string = '小王';
var str="hello"//隐式推论 通过复制初始化 推测出string
console.log(names);
//number
// 和JS一样,TS里的所有数字都是浮点数,类型是 number。 支持2、8、10、16等各种进制。
var age:number = 23;
let n2: number = 0xf00d;// ES6 中的十六进制表示法,会被编译为十进制数字
let n3: number = 0b1010;// ES6 中的二进制表示法,会被编译为十进制数字
let n4: number = 0o744;// ES6 中的八进制表示法,会被编译为十进制数字
let n5: number = NaN;
// 只声明不赋值是可以的
let c:number;
//bollean
let flag:boolean = true;
// flag= new Boolean(1);====>类型错误,flag是布尔型的;new Boolean(1)是布尔对象
// 数组
// TS像JS一样可以操作数组元素。 有两种方式可以定义数组。 第一种,可以在元素类型后面接上 [],表示由此类型元素组成的一个数组。
let score:number[] = [1,20, parseInt('50')];//只允许数组中是number类型的
let fruit:Array<string|number> = ['apple', 'banana', 'pear', 20];//数组中可以存放number和string类型的数据
let arr1: number[] = [1, 1, 2, 3, 5];//正确
// let arr2: number[] = [1, '1', 2, 3, 5];//错误,只能放number类型的数据
//元组
// 元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。 比如,你可以定义一对值分别为 string和number类型的元组。
// 数组合并了相同类型的对象,而元组(Tuple)合并了不同类型的对象。
//1.默认值
let tom: [string, number] = ['Tom', 25];
//2.通过下标赋值
let tom2: [string, number] = ['', 0];
tom[0] = 'Tom';
tom[1] = 25;
let arr: [string, number]=["hello",11];
let [m1,m2]:[string,number]=arr;//隐式代码====>m1:string=arr[0],m2:number=arr[1]
// 枚举
// enum类型是对JS标准数据类型的一个补充。 使用枚举类型可以为一组数值赋予友好的名字。
// 枚举类型用于取值被限定在一定范围内的场景,比如一周只能有七天,颜色限定为红绿蓝等。
// 枚举成员会被赋值为从 0 开始递增的数字,同时也会对枚举值到枚举名进行反向映射,也可以手动的指定成员的数值;
//一周的每天
enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
console.log(Days.Sun, Days.Mon, Days.Tue, Days.Sat);
console.log(Days["Sun"] === 0); // true
console.log(Days["Sat"] === 6); // true
//根据编号得到元素名
console.log(Days[0] === "Sun"); // true
console.log(Days[6] === "Sat"); // true
// any
// 有时需要为那些在编程阶段还不清楚类型的变量指定一个类型。
// 这些值可能来自于动态的内容,比如来自用户输入或第三方代码库。
// 这种情况下,我们不希望类型检查器对这些值进行检查而是直接让它们通过编译阶段的检查,这个现象叫做静默。
// 那么我们可以使用 any类型来标记这些变量:
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean
let anyThing: any = 'hello';
console.log(anyThing.myName);//anyTing。myName属于任意类型
// 任何类型都可以给这个变量赋值
// 常用在函数返回值
// 特点:某种类型的数据可以复赋值给any类型的变量
// any类型编译时会通过,但是运行时可能会出现问题
// 任意类型可以给any类型复赋值
let n1:any;
n1="hello"; //n1赋值hello后还是任意类型
n1=1234
console.log(n1.xxx)//不会报错,因为n1是any类型的不是赋值的number类型。所以编译会通过,但是运行时就会报错
// any类型也可以赋值给任意类型
let w:any;
let res:string;
res=w;
// void
// void,无效的,表示没有任何类型。 当一个函数没有返回值时,其返回值类型是 void;
function warnUser(): void {
console.log("This is my warning message");
}
// 声明一个void类型的变量没什么用,因为你只能为它赋予undefined和null:
let unusable: void = undefined;
// null和undefinde
// undefined和null两者各自有自己的类型undefined和null。 和 void相似,用处不大:
// 可以赋值给任意类型的变量
let w1:null;
// w1=undefined;
let b:number;
b=100;
// b=undefined;// 编译是可以通过的
// 任何类型赋值给null和undefined是不行的
let w2:null;
let b2:number;
// w2=b2;//编译失败
// never
// never类型表示的是那些永不存在的值的类型。
// 例如, never类型是那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型;
// 返回never的函数必须存在无法达到的终点
function error(message: string): never {
throw new Error(message);
}
// object
// object表示非原始类型,也就是引用类型,是除number,string,boolean,symbol,null或undefined之外的类型,
// 可以使用"对象", "数组对象"、string、number等为其赋值,null和undefined不行的。
// 之所以Object变量可以接收任何对象,是因为Object是所有类的父类。
let a:Object = [1, 2, 3]
let a2:Object={name:"jack",age:20}
// 数组和对象都可以
console.log(typeof null); //打印Object,因为最后是node在运行,object