主题
原始类型和特殊类型
原始类型
typescript
let str: string = "jimmy";
let num: number = 24;
let bool: boolean = false;
let u: undefined = undefined;
let n: null = null;
let obj: object = { x: 1 };
let big: bigint = 100n;
let sym: symbol = Symbol("me");
注意点
- undefined 和 null 是所有类型的子类型,即可以把 null 和 undefined 赋值给其他类型
typescript
let count: number = undefined
- number 和 bigint 不兼容
never
表示的是那些永不存在的值的类型
一般用于以下两种情况
- 函数抛出异常(这个函数永远没有返回值)
typescriptfunction err(msg: string): never { // OK throw new Error(msg); }
- xxxxxxxxxx // 断言多个interface Props { name: 'musi', id: 1} as const// 元祖断言['musi' as const]typescript
typescriptfunction loopForever(): never { // OK while (true) {}; }
void
- 表示空,可以是 undefined 或 never
- 大部分时候只用于没有返回值的函数类型
typescript
const fun = (name: string): void => {
console.log(name)
}
js 中函数没有返回值会返回 undefined,但 ts 中需要定义成 void 类型,若定义 undefined 类型,会报错
any
- 任何类型都可以赋值给它,它也可以赋值给任何类型(除了 never)
- 访问任何属性都是允许的,也允许调用任何方法
- 变量如果在声明的时候,未指定其类型,那么它会被识别为 any 类型
typescript
let any: any
any = 7
any = 'seven'
any.getName()
unknown
- 任何类型的值都可以赋值给它,但它只能赋值给
unknown
和any
typescript
let notSure: unknown = 4;
notSure = "maybe a string instead"; // OK
notSure = false; // OK
let uncertain: number = notSure; // Error
相比与 any,unknown 具有更强的预防性,更安全,它要求我们必须缩小类型类型
- 使用
typeof
、类型断言
等方式来缩小未知范围
typescript
let notSure: unknown = 4;
if (typeof notSure === 'number') {
let uncertain: number = notSure;
}
Number、String、Boolean、Symbol
是对应原始类型的包装对象
从类型兼容性上看,原始类型兼容对应的对象类型,反过来对象类型不兼容对应的原始类型
typescript
let num: number;
let Num: Number;
Num = num; // ok
num = Num; // Error
不要使用对象类型来注解值的类型,因为这没有任何意义