likes
comments
collection
share

TypeScript 内置数据类型

作者站长头像
站长
· 阅读数 69

TypeScript 在 JavaScript 的基础上增加了静态类型系统,使代码的可读性更强,让代码重构变得更容易,本文介绍 TypeScript 的 14 种内置数据类型。

boolean

boolean 类型是 TypeScript 中的一种基本数据类型,不能再进一步被分解,只有 true 和 false 这两种取值,除了使用 true 或 false 这两个字面量,还能使用 Boolean 构造函数创建 boolean 类型。

string

string 类型表示文本数据,是 TypeScript 中的一种基本数据类型。string 类型可以是字面量也可以通过String构造函数创建。

number

number 表示数值,它是 TypeScript 中的一种基本数据类型。number 类型可以是字面量也可以通过Number 构造函数创建。

bigint

bigint 类型是 TypeScript 中的一种基本数据类型,当防止数字太大超过 number 类型的范围时,可以使用 bigint 类型,bigint 类型与 number 类型不能相互赋值,bigint 类型可以用字面量创建也能用 BigInt 构造函数创建,代码如下:

const foo: bigint = BigInt(100);

const bar: bigint = 100n;

symbol

symbol类型是 TypeScript 中的一种基本数据类型,没有字面量,只能通过 Symbol() 创建。

undefined

undefined 类型只有 undefined 这一个取值,是TypeScript中的一种基本数据类型。

null

null类型只有 null 这一个取值,是TypeScript中的一种基本数据类型。当 strictNullChecks 为false 时,null 类型与 undefined 类型可以相互赋值,此时,可以将 null 和 undefined 赋给除 never 类型之外的任何类型,strictNullChecks 的默认值为 false。

never

never 类型是 TypeScript 中的一种基本数据类型,它没有实际的取值,表示一种不存在的状态,比如:一个数既是1又是2,这种情况是不存在的,这就是never。除了never本身可以赋值给never类型之外,其他任何类型都不能赋值给never类型。

在开发项目时,如果某个变量有多种取值,我们要对每一种取值单独处理,使用never类型可以防止漏处理。通过下面这段代码说明never类型的用处:

// hobby 只有 exercise 和 eat 两种取值
function handleHobby(hobby: 'exercise' | 'eat') {
    switch(hobby) {
        case 'exercise':
            // 当 hobby 为 exercise 时
            break
        case 'eat':
            // 当 hobby 为 eat 时
            break
        default:
            // 这个地方是 never
            const neverVal: never = hobby
    }
}

如果之后 hobby 的取值增加了,那么上述 default 块中的 hobby 变量就不是 never 了,这时TypeScript 编译器会报类型错误。如果应用程序是类型安全的,通常你的程序运行不到never,除非你有意写一个死循环或者有意让函数总是抛出错误,代码如下所示:

// 这个函数永远运行不完,它不能顺利执行到函数终点,所以它的返回值是never
function notTheEnd(): never{
    while(true) {
        // do something
    }
}

// 这个函数总是因抛出错误而被终止执行,它不能顺利执行到函数终点,所以它的返回值是never
function alwaysError(): never {
    throw 'error'
}

void

void 类型是 TypeScript 中的一种基本数据类型,它表示没有任何类型,可以将它看作与 any 类型相反。这种类型通常被用于函数的返回值,如果函数的返回值类型为void,就表示函数能顺利执行完,但是没有返回值。

undefined 可以赋值给 void 类型,当 strictNullChecks 为 true 时,null 不能赋值给 void 类型,除此之外,null 可以赋值给 void。下面通过代码说明函数返回值类型为 void 的情况

function justLog(): void {
    console.log('这个函数的返回值类型为 void')
}

function notReturn() {
    return
}

如果你的函数不返回任何值,那么推荐将函数的返回值类型显示的设置为void,如上述代码justLog函数所示,这样做有一些好处,比如:不看函数体就能知道这个函数没有返回值。

void 类型和 never 类型在程序运行时不代表任何值,它只是在 TypeScript 编译阶段做类型检查。

any

any 类型是 TypeScript 中的一种基本数据类型,它表示所有类型的集合,与 void 类型相反。any 类型是 TypeScript 中的超类型,任何数据类型都能赋给 any 类型。

如果变量没有类型注释,那么 TypeScript 会认为这个变量是 any 类型。将编译器的noImplicitAny 配置项设置为 true,能防止程序中有隐含的 any 类型。尽量少使用 any 类型,如果 TypeScript 程序中所有变量的数据类型都是 any,那么就相当于没有使用静态类型系统。

当不能确切知道变量的类型时,any 类型非常有用,但是由于 any 类型代表所有的类型,TypeScript 不对它进行类型检查,对此可以用类型守卫对 any 类型进行类型收窄,本书后面的章节会介绍类型守卫。

unknown

unknown 类型是 TypeScript 中的一种基本数据类型,它是除 any 类型之外的另一个超类型,可以将任何数据类型赋给 unknown 类型,它与 any 类型很相似,当访问属性或者将它们赋给一个确定的数据类型时,才会表现出差异。下面通过代码来说明它们之间的差异。

let valueUnknown: unknown
let valueAny: any

valueAny = 'hello' // 不会有类型错误
valueUnknown = 'hello' // 不会有类型错误

valueAny.trim() // 不会有类型错误
valueUnknown.trim() // 类型错误

valueAny() // 不会有类型错误
valueUnknown() // 类型错误

const stringA: string = valueAny // 不会有类型错误
const stringB: string = valueUnknown // 类型错误

从上述代码可以看出,不能在 unknown 类型上访问属性和方法,不能将 unknown 类型赋给某个确定的数据类型,unknown 类型不能当做函数来调用。

object

object 类型是 TypeScript 中的一种基本数据类型,但是在 Javascript 中它不是基本类型。在TypeScript 中,除 number、string、bigint、boolean、null、undefined、symbol 之外的类型都是 object 类型。当 TypeScript 编译器配置项 strictNullChecks 为 true 时,null 和 undefined 不能赋值给 object 类型。下面的代码定义了一个 object 类型的变量:

let st: object = {
    name: 'Bella',
    age: 23

}

st = 123 // 会报类型错误
st = [12] // 不会报类型错误
st = {level: 4} // 不会报类型错误

Array

在 TypeScript 中 Array 类型不是基本数据类型,它能被进一步拆分为基本数据类型。它表示一个有序的数据列表,这个数据列表中的每一项都是特定的数据类型。Array类型的类型注释格式为: type[]或者Array<type>,代码如下:

// myArr是Array类型,并且myArr中的每一项必须是string类型
const myArr: string[] = []
const myArr2: Array<string> = []

myArr.push(2)// 会有类型错误

Tuple

在TypeScript中Tuple不是基本数据类型,能被进一步拆分为基本数据类型,它与Array一样,表示有序的数据列表,但是这个数据列表中的数据项数量是固定的。代码如下:

const person: [string, number, boolean] = ['Bella', 24, false]

总结

有些内置类型,在程序运行时不代表任何值,只是在 TypeScript 编译阶段做类型检查,比如 never、void、any、unknown 等,还有一些内置类型即表示值也在编译阶段做类型检查,比如 string、number、boolean 等。TypeScript 将类型注释以 :type 的形式放在变量名的后面,type 可以是任何有效的内置数据类型和自定义数据类型。访问 TypeScript 类型系统和自定义数据类型 查看自定义数据类型。

转载自:https://juejin.cn/post/7216772871019806779
评论
请登录