typescript还有一些其他常见类型没有涉及,分为以下几类。
- 计算机类型系统理论中的顶级类型:
- any
- unknown
- 类型系统中的底部类型
- never
- 非原始类型
- object
-
any
为编程阶段还不清楚类型的变量指定一个类型时使用,这些值可能来自动态内容,如用户输入或者第三方代码库。
unknown是typescript3.0引入了新类型,是any类型对应的安全类型。
- 与any的区别:
- unkown类型会更加严格;在对unknown类型执行大多数操作以前,必须进行某种形式的检查。
- 对any类型执行操作以前,不必进行任何检查。
- unknown 与any的不同之处,虽然它们都可以是任何类型
- 但当unknown类型被确定是某个类型之前,不能被进行任何操作比如实例化,getter,函数执行等;
- any可以,因此unknown是更安全的any,any由于过于灵活的设定,导致它与JavaScript没有太多区别,容易产生低级错误。 ```javascript let value: any; value.foo.bar; // ok value(); //ok new value(); //ok value[0][1]; //ok
let value: unknown; value.foo.bar; // ERROR value(); // ERROR new value(); // ERROR value[0][1]; // ERROR
- 缩小其类型范围时可以执行unknown```javascriptfunction getValue(value:unknown):string {if(value instanceof Date) {return value.toISOString();}return String(value);}
never
never类型表示的是那些永远不存在的值的类型。never类型是任何类型的子类型,也可以赋值给任何类型。而,没有类型是never的子类型或可以赋值给never类型(never本身除外)
即使any也不可以赋值给never
never比较常见的场景 ```javascript // 抛出异常的函数永远不会有返回值 function error(message: string):never { throw new Error(message); }
// 空数组,而且永远是空的 const empty: never[] = []
<a name="ALn0j"></a>## 数组- 数组定义方式有两种- 1.使用泛型```javascriptconst list: Array<number> = [1,2,3]
元组类型与数组类型非常相似,表示一个已知元素数量和类型的数组,各元素的类型不必相同。
- 比如,你可以定义一对值分别是string和number类型的元组。
// 栗子一let x: [string,number]x = ['hello',10,false] // Errorx = ['hello'] // Error//栗子二let x:[string,number]x=['hello',10] // okx=[10,'hello'] //error
- 比如,你可以定义一对值分别是string和number类型的元组。
元组与数组的不同之处,元组的类型如果多出或者少于规定的类型是会报错的,必须严格跟事先声明的类型一致才不会报错
类型完全一致,顺序错了也会报错(如上例子二)
- 元组中包含的元素必须与声明的类型一致,不能多不能少,更不能顺序不符。
元组是数组的更严格版本,比如[string,number]我们可以看成:
interface Tuple extends Array<string | number> {0:string;1:number;length:2;}
元组继承与数组,但是比数组拥有更严格的类型检查。
元组越界问题
object表示非原始类型,即除number,string,boolean,symbol,null,undefined以外的类型。
- 普通对象、枚举、数组、元组通通都是object类型。
