文章目录
- 类型注解
- 基本数据类型
- 枚举类型
- 顶端类型
- 尾端类型
- never的应用场景
类型注解
通过类型注解来标识一个变量的具体类型,语法::Type
。
类型注解是放在被修饰的实体的后面,比如:
const str:string = 'typescript';
关于类型检查,有两种模式:
- 非严格类型检查【默认的一种方式】,类型检查比较宽松。比如在非严格类型检查模式下,对undefined和null没有做过多的限制,允许把null类型或者undefined类型的值赋给string类型的变量。如果我们需要把JavaScript代码迁移到Typescript上的时候,非严格模式是一个很好的选择,它能够让我们能够快速完成迁移的工作。
- 严格类型检查,尽可能的发现代码中的错误,使用严格模式更利于提高代码的质量。
在tsconfig.json配置文件中设置严格模式:
{
"compilerOptions": {
"strict": true,
}
}
基本数据类型
Typescript的基本数据类型:boolean、string、number、bigInt、symbol、undefined、null、void、枚举类型、子,字面量类型。
void类型表示某个值不存在,这个类型作为函数的返回值类型。如果一个函数没有返回值,那么这个函数的返回值类型为void类型。
枚举类型
枚举类型是通过enum关键字来定义的,比如:
enum SSS{
Spring,
Summer,
Fall,
Winter
}
枚举类型分为:
- 数值型枚举,是number类型的子类型,枚举成员的值为数字
- 字符串枚举,枚举成员的值为字符串
- 异构型枚举,在一个枚举中同时定义了数值型枚举和字符串枚举成员。
不管是哪一种枚举,都可以通过枚举成员来访问枚举成员的值,比如:
enum Bool{
False = 0,
True = 1,
}
Bool.False; // 0
顶端类型
是一种通用的类型,顶端类型包含了类型系统中所有的可能的值。在Typescript中有两种顶端类型:any和unknown。
重点 any类型就是用来跳过编译器的类型检查的。所有类型都是any的子类型,任何类型的值都可以赋值给any类型
虽然any类型是能够跳过编译器的类型检查,但是在程序中,我们应该尽可能的减少使用any类型,只有定义明确的类型信息,Typescript编译器才能够有效的进行类型检查,这也是我们选择Typescript的原因。
unknown类型:任何其他类型的值都能赋值给unknown类型,和any类型一样,但是unknown类型比any类型更安全,因为unknown类型只能赋值给any类型或者unknown类型
unknown类型的另一个特点就是在使用之前,必须先细化为某一种具体类型,比如:
function f2(msg:unknown){
if(typeof msg==='string'){
return msg.length;
}
}
如果没有条件限制,直接返回msg.length,会有提示length的类型应该为unknown:
但是any类型就没有这些限制。
尾端类型
Typescript提供的尾端类型是never类型,never类型不包含任何值。never类型是所有其他类型的子类型,所以never类型的值是可以赋值给任何类型的,但是所有其他类型的值不能赋值给never类型。
never的应用场景
场景1: never类型可以作为函数的返回值类型,表示函数不能返回一个值,比如:
function f1():never{
throw new Error("");
}
有一种情况是函数没有设置return语句,函数正常执行结束后,是返回一个undefined,这时候函数的返回值类型是void而不是never类型。
在函数根本不能返回一个值的时候,函数的返回值类型才是never类型。比如上面代码中的f1函数,这个函数中抛出异常,导致函数终止运行,这时候函数不会返回任何值。
**场景2:**在条件类型中使用never类型来辅助完成一些类型运算,比如:Exclude<T,U> = T extends U ? never : T;
。