TypeScript实战-03-TS基本数据类型介绍和使用

前言

上一篇,搭建了简单的TS项目模板
本篇对TS基本数据类型进行介绍和使用

二,TS的数据类型

ES6的数据类型:

6种基本数据类型

	Boolean
	Number
	String
	Symbol
	undefined
	null

三种引用类型

	Array
	Function
	Object

TS在ES6基础上,新增了一下数据类型

	void
	any
	never
	元组
	枚举
	高级类型

除此之外,TS还有很多类型的高级使用技巧


三,类型注解

TS可以通过类型注解对变量类型进行约束
TS和JS最主要的区别:变量的数据类型不可改变

语法: 变量/函数 : type

如: let hello : string = 'Hello TypeScript'

使用上节代码,在src目录下新增datatype.ts,用于测试TS变量类型,在index.ts中引入

src/index.ts:

import './datatype'

let hello : string = 'Hello TypeScript'
document.querySelectorAll('.app')[0].innerHTML = hello;

四,原始类型

let bl: boolean = true
let num: number = 123
let str: string = '123'

当使用类型注解对变量进行类型约束后,进行不恰当的赋值会报错


五,数组类型

定义数组的两种方式:

1, 类型名称+[]
2,Array关键字+<数据类型>
let arr1: number[] = [1, 2, 3]
let arr2: Array<number> = [1, 2, 3]

此时如果为数组添加非number类型的成员会报错:

let arr3: Array<number> = [1, 2, 3, "4"]

报错:
Type 'string' is not assignable to type 'number'.

如果希望为数组\成员定义不同的数据类型,可使用联合类型:

let arr3: Array<number | string> = [1, 2, 3, "4"]

此时,数组元素既可以是number类型,也可以是String类型


六,元组类型

是一种限制数组的元素类型和个数的数组
let tuple: [number, string] = [0, '1']

此时,如果改变数组的元素类型或添加元素数量,编辑器都会报错:

let tuple: [number, string] = [0, 1]
Type 'number' is not assignable to type 'string'.

let tuple: [number, string] = [0, '1', '2']

报错:
Type '[number, string, string]' is not assignable to type '[number, string]'.
Types of property 'length' are incompatible.
Type '3' is not assignable to type '2'.
元组越界问题:

虽然元组限制了数组元素的类型和数量,过多的元素声明会报错
但TS允许向元组中使用数组的push方法插入新元素(但不允许访问)

let tuple: [number, string] = [0, '1']
tuple.push(2)
console.log("tuple.push(2)", tuple) // tuple.push(2) (3) [0, "1", 2]

但不允许访问:

tuple.push(2)	// 可越界添加
tuple[2]	// 不可越界访问

报错:
Tuple type '[number, string]' of length '2' has no element at index '2'.

七,函数

正常的ES6函数声明:

let add = (x, y) => x + y

报错:
Parameter 'x' implicitly has an 'any' type.
Parameter 'y' implicitly has an 'any' type.

需要为参数添加类型注解:

let add = (x: number, y: number) => x + y

还可以约束函数的返回值类型:

let add = (x: number, y: number): number => x + y

函数的返回值类型通常是可省略的,TS的类型推断功能够正确推断出返回值类型

typeguess


定义函数类型:

// 声明函数类型
let computer: (x: number, y: number) => number
// 函数实现:参数名可以和定义时不一样,也不必再次指定参数类型
computer = (a, b) => a + b

这里可以看到,对函数进行实现时,IDE会自动提示函数类型信息:

函数提示


八,对象

JS中可以任意修改对象属性,TS中不允许

let obj: object = {x: 'a', y: 'b'}
obj.x = 3	// Property 'x' does not exist on type 'object'.

这是因为,对象obj的类型注解是object,并没有对内部具体属性和类型做严格限制

let obj: {x: string, y: string} = {x: 'a', y: 'b'}
obj.x = 'c'

九,Symbol

Symbol的含义是具有唯一的值,可以显式声明,也可直接创建
let symbol1: Symbol = Symbol()  // 显示声明
let symbol2 = Symbol()  // 直接创建
// 验证:是否是同一个对象
console.log(symbol1 === symbol2)    // fasle

十,undefined 和 null

let udf: undefined = undefined
let nu: null = null

但是,声明了undefined,就不能再被赋值为任何其他的数据类型了,只能被赋值为它本身

let undf: undefined = 1 // Type '1' is not assignable to type 'undefined'.

反过来undefined和null也不能被赋值给任何其他类型

// 验证:undefined和null也能被赋值给任何其他类型
let num1: number = undefined    // Type 'undefined' is not assignable to type 'number'.
let num2: number = null // Type 'null' is not assignable to type 'number'.
允许undefined和null被赋值其他类型
在TS中,undefined和null是任何类型的子类型,所以可以被赋值给其他类型

设置允许被辅助为其他类型,打开tsconfig.js,将strictnullchecks=false(认true)

nullcheck


修改此配置,但实现对undefined和null的赋值,可以使用联合类型

let num3: number | undefined | null = 111

十一,void

在js中,void操作符可以是任何一个表达式返回undefined

void 0 	将返回undefined

在js中甚至可以自定义一个undefined变量覆盖掉全局的undefined,所以undefined并不是保留字

undefined

闭包中,undefined就覆盖了全局的undefined
使用void可以有效的避免这种问题发生,确保返回值一定是undefined

在TS中,void类型表示没有任何返回值的类型

// void
let voidFunc = () => {}

十二,any

any:如果不指定TS的变量类型,认为any类型,可以赋值为任何类型

let x
x = 1   // 整型
x = []  // 数组
x = () => {} // 函数

但一般不建议使用any类型,那样就失去了ts的意义


十三,never

never:永远不会有返回值的类型

1,函数抛出异常,永远不会有返回值,类型为never

// 函数抛出异常,永远不会有返回值,类型为never
let error = () => {
    throw new Error('error')
}

2,死循环函数永远没有返回值,类型为never

// 死循环函数永远没有返回值,类型为never
let endless = () => {
    while(true) {}
}

十四,结尾

介绍了TS的类型注解和基本数据类型
TS的数据类型包含了全部ES的类型,并能够通过any类型实现对js的兼容
TS的加入,使JS的变量和函数具有了类型概念

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐