简介

TypeScript支持的数据类型与JavaScript基本一样,另外提供了枚举类型。还有几个特殊类型:anyvoidnever

下面写一些例子去理解TypeScript的数据类型使用。

原始类型

// boolean
let success: boolean = true;
// number
let num1: number = 12;
let num2: number = 0xab; // 支持多种进制
// string
let str1: string = 'abc';

除上述示例,还有null, undefined, symbol类型,可以参看文档。

数组和元组

数组有两种声明方式:

let arr1: string[] = ['hello', 'world'];
let arr2: Array<string> = ['hello', 'world'];

元组是一种特殊的数组

let arr1: [string, number] = ['hello', 123];
arr1[3] = 'world'; // 越界时:string | number
元组越界时,会以联合类型来处理,即越界的元素可以元组中的任意一种类型。

枚举

枚举类型与C#,Java语言相比,另外提供了一个便利特性,可以拿到枚举的名称。

enum Color {Red = 1, Green, Blue}
let colorName: string = Color[2];

console.log(colorName);  // 显示'Green'因为上面代码里它的值是2

any, void

  • any表示任意类型,可以在类型不确定时使用(能不用就不要用),如:

    • 第三方的返回值,你无法确定类型
    • 你不确定你将会用到哪些类型
  • void正好相反,表示没有类型,一般用于没有返回值的函数

null, undefined

  • 类型定义和JavaScript一致
  • TypeScript里面,可以赋给:本身类型、any、void

object

object类型是基本的6个类型之外的其他类型的基类。

使用时需注意,用object声明时,后面只能当object使用,如:

let a: object = new Date();
a.hasOwnProperty('name'); // ok
a.getDate(); // error

never

never是个比较特殊的类型,表示永远不会到达。

典型的场景就是异常抛出函数的返回值。另外,不可达分支也可以用,帮助判断是否列全分支。

// 抛出异常的函数
function bizError(code: number, msg: string): never {
   throw new Error({
       code,
       msg
   }); 
}
// 不可达的分支
function foo(n: 0 | 1) {
  switch(n) {
    case 0: 
      return 'A'
    case 1:
      return 'B'
    default:
      const _never: never = n
      return n
  }
}

类型断言

类型断言,我觉得也可以理解为强制类型转换。

这个特性和强类型语言类型,看几个例子理解一下:

// 尖括号
let var1: any = 'abc';
console.log((<string>var1).substring(1));

// as
let var2: object = new Array<number>();
console.log((var2 as Array<number>).push(1));

类型推断

有些情况下,不需要指明变量类型,TypeScript可以根据上下文自动推断类型。如下示例:

let a = 'abc';
console.log(a.substring(1));

let obj1 = {
    str1: 'abc',
    num1: 123
};

let { str1, num1 } = obj1;

参考

  1. TypeScript语言手册 https://www.tslang.cn/docs/ha...

xie_zhichao
1.1k 声望274 粉丝

Web全栈开发者。