typescript还有一些其他常见类型没有涉及,分为以下几类。

  • 计算机类型系统理论中的顶级类型:
    • any
    • unknown
  • 类型系统中的底部类型
    • never
  • 非原始类型
    • object
  • 其他常见的数组,元组等

    any

  • 为编程阶段还不清楚类型的变量指定一个类型时使用,这些值可能来自动态内容,如用户输入或者第三方代码库。

    • 此情况下,当不希望类型检查器对这些值进行检查而是直接让它们通过编译阶段的检查时,则可以使用any类型来标记这些变量
    • 除非是在不得已的情况下,我们不应该首先考虑使用此类型

      unknown

  • 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

  1. - 缩小其类型范围时可以执行unknown
  2. ```javascript
  3. function getValue(value:unknown):string {
  4. if(value instanceof Date) {
  5. return value.toISOString();
  6. }
  7. return String(value);
  8. }

never

  • never类型表示的是那些永远不存在的值的类型。never类型是任何类型的子类型,也可以赋值给任何类型。而,没有类型是never的子类型或可以赋值给never类型(never本身除外)

    即使any也不可以赋值给never

  • never比较常见的场景 ```javascript // 抛出异常的函数永远不会有返回值 function error(message: string):never { throw new Error(message); }

// 空数组,而且永远是空的 const empty: never[] = []

  1. <a name="ALn0j"></a>
  2. ## 数组
  3. - 数组定义方式有两种
  4. - 1.使用泛型
  5. ```javascript
  6. const list: Array<number> = [1,2,3]
  • 2.使用更加广泛,那就是在元素类型后面接上[]:
    1. const list:number[] = [1,2,3]

    元组(Tuple)

  • 元组类型与数组类型非常相似,表示一个已知元素数量和类型的数组,各元素的类型不必相同。

    • 比如,你可以定义一对值分别是string和number类型的元组。
      1. // 栗子一
      2. let x: [string,number]
      3. x = ['hello',10,false] // Error
      4. x = ['hello'] // Error
      5. //栗子二
      6. let x:[string,number]
      7. x=['hello',10] // ok
      8. x=[10,'hello'] //error
  • 元组与数组的不同之处,元组的类型如果多出或者少于规定的类型是会报错的,必须严格跟事先声明的类型一致才不会报错

  • 类型完全一致,顺序错了也会报错(如上例子二)

    • 元组中包含的元素必须与声明的类型一致,不能多不能少,更不能顺序不符。
    • 元组是数组的更严格版本,比如[string,number]我们可以看成:

      1. interface Tuple extends Array<string | number> {
      2. 0:string;
      3. 1:number;
      4. length:2;
      5. }
    • 元组继承与数组,但是比数组拥有更严格的类型检查。

  • 元组越界问题

    • typescript中允许向元组中使用数组的push方法插入新元素:
      1. const tuple:[string,number] = ['a',1];
      2. tuple.push(2); //ok
      3. console.log(tuple); // ["a",1,2] -> 正常打印出来
      4. // 但是访问新加入的元素时,会报错
      5. console.log(tuple[2]); //Tuple type '[string,number]' of length '2' has no element at index '2'

      Object

  • object表示非原始类型,即除number,string,boolean,symbol,null,undefined以外的类型。

  • 普通对象、枚举、数组、元组通通都是object类型。