TypeScript常见的类型约束

239 阅读5分钟

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。。。