TypeScript的基础类型

203 阅读4分钟

一. 基础类型

所有的类型都在冒号的后面,ts的核心一切都以安全为准,需要注意的是ts编译成js是没有类型的,ts只是在开发时使用

1.1 布尔、数字、字符串

let bool:boolean = true;
let num:number = 10;
let str:string = 'hello';

基本类型首字母大小写的区别,number用来描述类型和Number用来描述实例(类也可以当做类型)

let num1: number = 1;
let num2: Number = 1; // 用来描述实例的 类也可以当做类型
let num3: number = Number(1)
let num4: Number = new Number(1);

1.2 数组

数组的概念:一类类型的集合

let arr1:number[] = [1,2,3];
let arr2:string[] = ['1','2','3'];
let arr3:(number|string)[] = [1,'2',3];	 // 并集
let arr4:Array<number | string> = [1,'2',3]; // 泛型方式来声明
// 如果数组里放的内容,就是无规律的可以用 any
let arr5:any[] = ['',1,{}];

1.3 元组

元组中增加数据,只能增加元组中存放的类型

// 规定了 数组中的每一项的类型
let tuple:[string,number,boolean] = ['hello',10,true];	// 初始化的时候必须按要求填入数组
// 在放入的时候,可以放入元组定义的类型
tuple.push('world');
tuple[3] = 100;	// 报错 ,不能通过索引更改元组

1.4 枚举

枚举分为普通枚举、异构枚举、常亮枚举

enum USER_ROLE {	// 枚举类型大写是规范,不强制大写
    USER, // 默认从0开始
    ADMIN,
    MANAGER
}
// {0: "USER", 1: "ADMIN", 2: "MANAGER", USER: 0, ADMIN: 1, MANAGER: 2}

可以枚举,也可以反举

// 编译后的结果
(function (USER_ROLE) {
    USER_ROLE[USER_ROLE["USER"] = 0] = "USER";
    USER_ROLE[USER_ROLE["ADMIN"] = 1] = "ADMIN";
    USER_ROLE[USER_ROLE["MANAGER"] = 2] = "MANAGER";
})(USER_ROLE || (USER_ROLE = {}));
  • 异构枚举

枚举可以支持反举 ,但是限于索引,会根据上一个人的值 进行自动的推断

enum USER_ROLE {
    USER = 'user',
    ADMIN = 5,
    MANAGER,	// 根据上一个 5 推出当前是 6
}
  • 常量枚举

加上const不会生成一个对象(更简洁),但是常量枚举不支持反举

const enum USER_ROLE {
    USER,
    ADMIN,
    MANAGER,
}
console.log(USER_ROLE.USER)// console.log(0 /* USER */);

1.5 nullundefined

nullundefined是"任何类型的子类型",但是在严格模式下(strictNullChecks的值为true),null只能赋给nullundefined只能赋给undefined

let u: undefined = undefined;
let n: null = null;

1.6 never

never 从不,代码无法达到终点,无法执行到结尾是 "任何类型的子类型",例如出错 、 死循环 、永远走不到的判断

function error(message: string): never {
    throw new Error("err");
}
function loop(): never {
    while (true) { }
}
function fn(x:number | string){
    if(typeof x == 'number'){

    }else if(typeof x === 'string'){

    }else{
        console.log(x); // never 做代码的完整校验
    }
}

1.7 void

void表示函数返回值,也可以描述变量,void的值只能赋予nullundefined,严格模式下,不能把null 赋予给void类型

function getVoid(): void {
    return undefined
}
let a:void;
a = undefined;

1.8 any

不进行类型检测

let arr:any = ['hello',true,{name:'world'}]

1.9 object

非原始类型

function create(obj: object) {

}
create({});
create(function () { })
create([]);

1.10 SymbolBigInt

Symbol表示独一无二

const s1: symbol = Symbol('key');
const s2: symbol = Symbol('key');
console.log(s1 == s2); // false

BigInt能够准确计算超过最大安全数的数字

const num1 = Number.MAX_SAFE_INTEGER + 1;
const num2 = Number.MAX_SAFE_INTEGER + 2;
console.log(num1 == num2)// true


let max: bigint = BigInt(Number.MAX_SAFE_INTEGER)
console.log(max + BigInt(1) === max + BigInt(2))

二. 类型推导

2.1 类型推导

  • 声明变量没有赋予值时默认变量是any类型

    let name; // 类型为any
    name = 'zhufeng'
    name = 10;
    
  • 声明变量赋值时则以赋值类型为准

    let name = 'zhufeng'; // name被推导为字符串类型 
    name = 10;
    

2.2 包装对象

我们在使用基本数据类型时,调用基本数据类型上的方法,默认会将原始数据类型包装成对象类型

let bool1:boolean = true;
let bool2:boolean = Boolean(1); 
let bool3:Boolean = new Boolean(2);

boolean是基本数据类型 , Boolean是他的封装类

2.3 联合类型

let numOrStr: string | number;
// 默认联合类型 在没有确定类型之前 只能调用两个类型共同的方法
// 在变量确定类型后 可以设置对应的方法
numOrStr = 'abc';
numOrStr = 123;
// 如果赋予类型后,可以根据上下文自动推断对应类型的方法

2.4 类型断言

  • 类型断言

! 非空断言,表示这个东西一定有值, 一定不为空

let name: string | number;
(name! as number).toFixed(2); // 强制
((<number>name!).toFixed(2));

as / <> 直接强转某个类型 , 强制告诉它这个类型就是里面的某一个,强转要求必须联合类型中有才行

  • 双重断言
let name: string | boolean;
((name! as any) as string);

尽量不要使用双重断言,会破坏原有类型关系,断言为any是因为any类型可以被赋值给其他类型

2.5 字面量类型

type Direction = 'Up' | 'Down' | 'Left' | 'Right';
let direction:Direction = 'Down';

可以用字面量当做类型,同时也表明只能采用这几个值(限定值)。类似枚举。