1. 字面量类型
常用方式:
let a: 'male' | 'female';
a = 'male'
a = 'female'
a = 'hello' // 报错
这就意味着a只能是male或者female,其他值都不可以。
上例中的竖线|表示联合类型,就像或,可以在列举的类型中选择
let b: string | boolean ;
b = 'hello';
b = true;
2. any
any表示任意类型,在不确定变量的类型可以使用,但不好滴地方就是失去了TS的类型检测功能。
let c: any;
c = 'hello';
c = 22;
c= true;
另外,声明变量而不指定类型,TS会自动判断为any。
3. unknown 未知类型
let d: unknown;
d = 'hello';
d = true;
它与any的区别是,当我们把any类型的变量赋给其他类型并不会报错,
let e: string;
e = c ; // 结合上边,c此时是布尔值,却能赋给字符串类型,把e的类型也给弄乱了。
但是如果是unknown
d = 'hello';
e = d; // 报错,unknown类型不能赋给string类型
此时虽然d的值是字符串,但他的类型是unknown,所以这会报错,也就避免了去扰乱其他类型的变量,可以说unknown是安全的any。我们不能直接对unknown类型直接赋值,但是可以通过下面这种方式来判断赋值。
if (typeof d === "string") {
e = d; // 通过}
或者我们使用类型断言as,用来告诉TS编译器变量的实际类型。两种写法
- 变量 as 类型
- <类型>变量
e = d as string;
// 或者
e = <string>d;
4. void never
这两个类型一般用于函数。
// void:函数没有返回值,返回值为空undefined
function (): void {
console.log('没有返回值')}
// never:函数永远不会返回结果,连空值都没有,例如抛出异常,报出异常意味着程序出现错误,出现错误以后,程序终止也就没有结果了
function(): never {
throw new Error ('报错了!')
}