Typescript
,就是给 JavaScript
加上了类型系统。Typescript
是 JavaScript
的超集。只要掌握了 JS
,学起 TS
来并不会太难。
本文整理了 Typescript
中的数据类型,作为学习 TS 的一道入门菜。
JS 中的数据类型
最开始 JS
中只有7个数据类型,根据在内存中存储空间的不同,又分为了两大类,基本数据类型和引用数据类型,具体是:
- 基本数据类型:
Number
、String
、Boolean
、Undefined
、Null
- 引用数据类型:
Object
、Function
随着 ES6
和 ES11
的发布,又新增了两个基本数据类型:Symbol
和 BigInt
,分别表示唯一值和大数字。
对于以上这些数据类型,相信大家都不陌生。接下来说一说 Typescript
中的数据类型。
TS 中的数据类型
Typescript
就是给 JavaScript
加上了类型系统。类型体现在哪里呢?就体现在声明变量和常量时。
在声明变量和常量时,在变量的后面使用 :
来声明该变量的类型。
基本数据类型的类型
let n: number = 10
let s: string = 'hello'
let b: boolean = true
let nl: null = null
let ud: undefined = undefined
let sb: symbol = Symbol('sb')
let bi: bigint = BigInt(100)
数组类型
TS 中的数组和 JS 中的有所不同。JS 中的数据其实是对象的变形,因为其内部元素可以是各种类型。
而 TS 中的数组,类型是固定的,或者可以使用联合类型来定义元素的类型。
// 声明一个数字类型的数组
let arr1:number[] = [1,2,3]
// 声明一个字符串类型的数组
let arr2:string[] = ['1','2','3']
// 声明一个数字或者字符串类型的数组
let arr3:(number|string)[] = [1,'2'];
元祖类型
元祖类型是一种特殊的数组类型,它的特点是限制元素长度、类型一一对应:
// 该元元祖类型的变量有两个值,且分别是数字类型和字符串类型
let tuple:[number, string] = [10, 'hello']
枚举类型
在没有枚举类型的 JS 中,我们通常会使用一个对象来模拟枚举的效果。比如一个权限系统的角色设计:
const role = {
admin: 0,
user: 1,
guest: 2
}
使用 TS 中的枚举来表示就是:
enum ROLE {
ADMIN, // 默认从0开始
USER,
GUEST
}
还有一种常量枚举。声明枚举时还可以手动设置值:
const enum ROLE {
ADMIN, // 默认从0开始
USER = 100,
GUEST = 1000,
}
void 类型
void
类型表示空,即没有类型,只能赋值给 undefined
和 null
这两个好兄弟使用。
一般只用在函数返回值类型上,当函数没有返回值时,使用它:
function foo = (msg: string): void {
console.log(msg);
}
never 类型
never
代表不会出现的值,不能把其他类型赋值给 never
。
function error(message: string): never {
throw new Error("err");
}
function loop(): never {
while (true) { }
}
function fn(x:number | string){
if(typeof x == 'number'){
} else if(typeof x === 'string'){
} else {
console.log(x); // never
}
}
any 类型
有时候大家会把 Typescript 叫作 AnyScript。
这是因为使用 TS,就是要用它的强大的类型系统。但有时候确实不知道某个值应该是什么类型的,如果不给它声明类型又不行,此时可以将其声明为 any
任意类型:
let a: any = {...随便什么东西}
使用 any
类型虽然编译器不再报错,但也就失去了类型系统的能力,不能获得类型检查和类型提示了。因此不到万不得已的时候慎用。
小结
本文简单介绍了 Typescript 中常用的数据类型和声明方式,基本上还是很好理解的。