TS 系列 - 基础数据类型

111 阅读3分钟

基础数据类型

为了方便记忆,我把基础数据类型分成了3部分,如下图 image.png

为变量添加注解(非引用类型)

一般来说,为类型添加注解都是在 变量名 后加 英文冒号(:),然后在 冒号 后面添加 类型名称 即可,语法如是:let variableName: typeName = value

string

let s: string = "Hello World!";
let ms: string = `${s}!!`;

number

let n: number = 123;

boolean

let b: boolean = true;

bigint

let bigint: bigint = 123n;

symbol

let sym: symbol = Symbol('sym');

null

表示值不存在

let nl: null = null;

undefined

表示值未初始化

let u: undefined = undefined;

void

表示没有任何类型的值,当它用来检查变量时,和 undefined 一致的效果,当它用来检查函数返回值时,表示没有值返回,或者返回值为 undefined

// 没有啥意义,一般不会这么写
let unusable: void = undefined;

// 没有返回值
function noReturn(): void {
  console.log('I will never return!');
}

// 默认返回值,与不写返回值是一致的效果,不写返回值时内部默认返回 undefined
function defaultReturn(): void {
  return undefined
}

never

表示的是那些永不存在的值的类型,换而言之,就是当程序被某种原因打断,无法到达终点时,此时的状态可以用 never 来约束。

never 类型是任何类型的子类型,也可以赋值给任何类型;然而,没有类型是 never 的子类型或可以赋值给 never 类型(除了 never 本身之外)。 即使 any 也不可以赋值给 never

// 抛出错误,导致程序终止
function throwAError(): never {
  throw new Error('An error occurred!');
}

// 无限循环,导致程序终止
function infiniteLoop(): never {
  while (true) {
    console.log('Infinite loop!');
  }
}

// 用 never 约束 never
function fail(): never {
  return throwAError();
}

// 将 never 类型赋值给其他类型
const f: string = fail();

any

表示任意类型的值,在无法得知变量类型时,去除类型检查

let any: any = 'Hello';
let ab: any = true;
let an: any = 123;
//...

为变量添加注解(引用类型)

image.png

object

它是所有引用类型的父类,也就是说,它可以用来约束所有的引用类型变量的值, 不过一般不会这么写,更多的是通过自定义一个约束类型对象去约束变量的值

// 一般不这么写
function Animal() { }
let animalConstructor: object = Animal;
let AnimalInstance: object = new Animal();
let date: object = new Date();

// 自定义一个约束类型对象去约束变量的值
let person: { name: string, age: number } = {
  name: 'John',
  age: 30
}

array

数组, 在 typescript 中, 数组的所有项都是同一类型,后面我们会提到数组的变种(元组),支持不同类型的值在同一个数组内。

当需要约束数组内部内容的类型时,可在 Array 后面用尖括号(<>)将数组内值的类型包裹起来, 我们称之为数组泛型。另外,它还有个简写方式,就是 类型 + []

// 完整写法
let list: Array<number> = [1, 2, 3];

// 简写
let l: number[] = [1, 2, 3];

元组

元组类型是另一种 Array 类型,它确切地知道它包含多少个元素,以及它在特定位置包含哪些类型。

// 只有两个元素,多余的元素被访问时会报错
let tuple: [number, string] = [1, '2'];

tuple[2] // Error: Tuple type '[number, string]' of length '2' has no element at index '2'.

枚举

枚举允许开发人员定义一组命名常量。 使用枚举可以更容易地记录意图,或者创建一组不同的用例。 TypeScript提供了基于数字和基于字符串的枚举。

  1. 每个枚举成员都有自己的元素编号,元素编号可以是数字类型,也可以是字符串类型,当为数字类型时,从上往下依次递增,默认第一个成员的元素编号为0(如果不手动指定的话)
  2. 枚举元素编号支持运算,运算将在编译时完全求值
// 枚举类型
enum Color {
  Red,
  Green,
  Blue
}
Color.Red // 0

// 成员编号手动指定
enum Food {
  Apple = 1,
  Banana,
  Cherry
}
Food.Apple // 1
Food.Banana // 2

// 支持字符串
enum Apple {
  Color = "COLOR",
  Size = "SIZE",
  Weight = "WEIGHT"
}
Apple.Color // "COLOR"

// 成员编号计算
enum Direction {
  Up = 1 + 1,
  Down,
  Left,
  Right
}
Direction.Up // 2