数据类型
一、number
const num: number = 20;
console.log(num);
二、string
const str: string = '小张';
console.log(str);
2.1 string vs String ?
- string 是 String 的类型表现,没有任何的方法和属性
- String 是一个构造函数,通过 Object、Number 类似,有着函数的方法和属性。
三、boolean
const bool: boolean = true;
console.log(bool);
四、undefined 和 null
默认情况下 null
和 undefined
是所有类型的子类型。 就是说你可以把 null
和 undefined
赋值给 number
类型的变量。
五、void
void表示没有任何类型,和其他类型是平等关系. void 不能直接赋值,所以一般用于函数返回值声明.
function fun(): void {
console.log('无返回数据');
}
fun();
六、symbol
const s1Symbol:symbol = Symbol('s1Symbol');
console.log(s1Symbol);
七、any
any类型是类型系统的顶级类型,动态的变量类型(失去了类型检查的作用)。any可以做为任何其他数据类型的父类(即 任何类型的值可以赋值给any),也可以作为任何其他数据类型的子类 (即 any类型的值也可以赋值给任何类型)。any 与 unknown 可以相互赋值
Typescript 中 any
类型的作用是什么?
为编程阶段还不清楚类型的变量指定一个类型。 这些值可能来自于动态的内容,比如来自用户输入或第三方代码库。 这种情况下,我们不希望类型检查器对这些值进行检查而是直接让它们通过编译阶段的检查。
any 作为任何其他数据类型的父类(即任何类型的值可以赋值给 any)
const bar:any = 123;
const bar1:any = "哈哈";
const bar2:any = false;
const bar3:any = {};
any 作为任何其他数据类型的子类
const bar:any = 123;
const bar1:any = "哈哈";
const bar2:any = false;
const bar3:any = {};
const b:number = bar;
const b1:string = bar1;
const b2:boolean = bar2;
const b3:object = bar3;
any 与 unknown 可以相互赋值
const bar4:any = '嘻嘻';
const b4:unknown=bar4;
const bar4:unknown = '嘻嘻';
const b4:any=bar4;
当 any 类型被赋值为一个对象时的特点:any 类型可以照常访问对象属性
const bar:any = {
name:'哈哈',
age:23
}
console.log(bar.name); // any 类型时,可以访问对象属性
console.log(bar.age); // any 类型时,可以访问对象属性
7.1 any vs unknown ?
- any 可以其他任何数据类型的父类,也可以作为其他任何数据类型的子类。而 unknown 可以作为其他任何数据类型的父类,但是不可以做为其他任何数据类型的子类。
- any 可以访问对象属性,unknown 不可以访问对象属性
八、unknown
unknown 类型是类型系统的顶级类型,在很多场景下,它可以替代 any 的功能同时保留静态检查的能力。unknown可以做为任何其他数据类型的父类(即 任何类型的值可以赋值给unknown),但是不也可以作为任何其他数据类型的子类 (即 unknown类型的值不可以赋值给任何类型)。any 与 unknown 可以相互赋值
unknown可以做为任何其他数据类型的父类(即 任何类型的值可以赋值给 unknown)
const bar:unknown = 123;
const bar1:unknown = "哈哈";
const bar2:unknown = false;
const bar3:unknown = {};
不也可以作为任何其他数据类型的子类 (即 unknown类型的值不可以赋值给任何类型)
const bar:unknown = 123;
const bar1:unknown = "哈哈";
const bar2:unknown = false;
const bar3:unknown = {};
const b:number = bar; // 报错 Type 'unknown' is not assignable to type 'number'
const b1:string = bar1; // 报错 Type 'unknown' is not assignable to type 'number'
const b2:boolean = bar2; // 报错 Type 'unknown' is not assignable to type 'number'
const b3:object = bar3; // 报错 Type 'unknown' is not assignable to type 'number'
any 与 unknown 可以相互赋值
const bar4:any = '嘻嘻';
const b4:unknown=bar4;
const bar4:unknown = '嘻嘻';
const b4:any=bar4;
当 unknown 类型被赋值为一个对象时的特点:unknown 类型不可以访问对象属性
const bar:unknown = {
name:'哈哈',
age:23
}
console.log(bar.name); // 报错 Object is of type 'unknown'.ts(2571)
console.log(bar.age); // 报错 Object is of type 'unknown'.ts(2571)
使用场景
-
避免使用 any 作为函数的参数类型而导致的静态类型检查 bug
8.1 any vs unknown ?
- any 可以其他任何数据类型的父类,也可以作为其他任何数据类型的子类。而 unknown 可以作为其他任何数据类型的父类,但是不可以做为其他任何数据类型的子类。
- any 可以访问对象属性,unknown 不可以访问对象属性
九、never
never类型表示的是那些永不存在的值的类型。值会永不存在的两种情况:
-
如果一个函数执行时抛出了异常,那么这个函数永远不存在返回值(因为抛出异常会直接中断程序运行,这使得程序运行不到返回值那一步,即具有不可达的终点,也就永不存在返回了);
function err(msg: string): never { // OK
throw new Error(msg);
} -
函数中执行无限循环的代码(死循环),使得程序永远无法运行到函数返回值那一步,永不存在返回。
function loopForever(): never { // OK
while (true) {};
}