TS-数据类型

576 阅读5分钟

这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战 JavaScript 中已经存在了一些数据类型,但是并不能很好的满足TypeScript的,因此TypeScript中引入的新类型来增强TypeScript能力

接下来就让我们一起看看TypeScript中那些数据类型

为一个变量指定类型的语法是使用"变量: 类型"的形式,如下:

let num: number = 123

如果你没有为这个变量指定类型,编译器会自动根据你赋给这个变量的值来推断这个变量的类型:

let num = 123
num = 'abc' // error 不能将类型“"123"”分配给类型“number”

当我们给num赋值为123但没有指定类型时,编译器推断出了num的类型为number数值类型,所以当给num再赋值为字符串"abc"时,就会报错。

注意,就是 number 和 Number 的区别:TS中指定类型的时候要用 number,这个是TypeScript的类型关键字。而 Number 为JavaScript的原生构造函数,用它来创建数值类型的值,它俩是不一样的。包括你后面见到的string、boolean 等都是TypeScript的类型关键字,不是JavaScript语法,这点要区分开。

Number

TypeScript 和 JavaScript 一样,所有数字都是浮点数,所以只有一个number类型,而没有int或者float类型。而且 TypeScript 还支持 ES6 中新增的二进制和八进制数字字面量,所以 TypeScript 中共支持二、八、十和十六四种进制的数值。

let num: number = 123

初始化完成数据类型便不能再将其他类型数据赋值

num = '123' // error 不能将类型“"123"”分配给类型“number”
num = 123 // 正确

Boolean

let bol: boolean = true;

String

let str: string = 'str';

Array

let list1: number[] = [1, 2, 3];
let list2: (number | string)[] = [1, 2, 'nordon'];
let list3: Array<string> = ['str']; // 不建议使用

第一种形式通过number[]的形式来指定这个类型元素均为number类型的数组类型,这种写法是推荐的写法,当然你也可以使用第二种写法。注意,这两种写法中的number指定的是数组元素的类型,你也可以在这里将数组的元素指定为任意类型。

Null&Undefined

null 和 undefined 有一些共同特点,所以放在一起讲。

共同特点:是因为在 JavaScript 中,undefined 和 null 是两个基本数据类型。

let unde: undefined = undefined;
let n: null = null;

在 TypeScript 中,这两者都有各自的类型即 undefined 和 null,也就是说它们既是实际的值,也是类型默认情况下 undefined 和 null 可以赋值给任意类型的值,也就是说你可以把 undefined 赋值给 void 类型,也可以赋值给 number 类型,当你在 tsconfig.json 的"compilerOptions"里设置了"strictNullChecks": true时,那必须严格对待。undefined 和 null 将只能赋值给它们自身和 void 类型,

tuple

元组可以看作是数组的扩展,表示已知元素的个数和类型,就是已经知道的数组的长度以及每个位置的数据类型

为元组赋值时, 个数和类型需要一一匹配对应

let tuple1: [number, string, boolean] = [1, 'nordon', true];

// tuple1[1] = 1; error, 应该是 string
tuple1[1] = 'wy';

enum

TypeScript 在 ES 原有类型基础上加入枚举类型,在 TypeScript 中也可以给一组数值赋予名字,这样对开发者来说较为友好。比如我们要定义一组角色,每一个角色用一个数字代表,就可以使用枚举类型来定义

会默认为 enum 的每个分配编号,默认0开始

enum Roles1 { // {0: "SUPER_ADMIN", 1: "ADMIN", 2: "USER", SUPER_ADMIN: 0, ADMIN: 1, USER: 2}
  SUPER_ADMIN,
  ADMIN,
  USER
}

any

在编写代码的时候,有时候会不知道数据具体是什么类型,这个时候就可以使用 any 类型, 更好的建议是 使用unknown 更加安全

any 需要慎用,若是大规模的使用 any, TypeScript将没啥意义了

let anyArr: any[] = [1, true];
let any1: any;
any1 = 1;
any1 = 'any str';

void

表示没有任意类型, 就是什么类型都不是, 和 any 相反

常用于表示 函数没有返回值

void类型的变量只能赋值为 null、undefined , 其他类型不能赋值给 void类型

function voidFun(): void {
  console.log('函数voidFun 没有任何返回值,只是log一下');
}

never

指那些永不存在的值的类型,它是那些总会抛出异常或者根本不会有返回值的函数表达式的返回值类型,当变量被永不为真的类型保护所约束时,该变量也是 never 类型

总是抛出异常的,所以返回值是never类型,表明其返回值永不存在

function neverErr(): never {
  throw new Error('抛出异常的 never');
}

unknown

表示未知的类型,和 any 的区别: unknown 比 any 安全点

为什么 unknown 比 any 安全?

若是将一个变量指定为any类型之后,这个变量就废了,和js无差了,可以对这个变量进行任意的属性、方法的访问,无非就是报错嘛

若变量是 unknown 类型,若是没有对其通过基于控制流的类型断言来缩小范围,是不能对其进行操作的

symbol

Es6新增的一种数据类型

let symbol1: symbol = Symbol('s');