TS类型
一、基础类型
1.数字 number
let num: number = 56
2.字符串 string
let str: string = '字符串'
3.布尔值 boolean
let isOk: boolean = true
二、空和未定义
注意:这两种类型有且只有一个值,所以在标注一个变量为null或undefined时,就表示这个变量不能被修改了
1.空 null
let data1: null = null;
2.未定义 undefined
let data2: undefined = undefined;
默认情况下,null和undefined是其他所有类型的子类型,所以在其他类型复制时可以将null和undefined赋值给其他值
let data = '字符串'
data = '字符串2'
data = null
data = undefined
会产生问题,如图:
解决方法
在tsconfig.json文件中加上
"strictNullChecks": true
定义但未类型标注且未赋值则为any
三、对象
1.内置对象类型
let obj: Object = {}
let arr: Array<number> = [1, 2, 3]
let date: Date = new Date()
2.自定义对象类型
a.字面量标注(不利于复用)
let user: { name: string, age: number } = {
name: '小可爱',
age: 18
}
b.接口 (推荐)
interface People {
name: string,
age: number
}
let p1: People = {
name: 'Tom',
age: 18
}
let p2: People = {
name: 'J',
age: 16
}
接口不能作为数据使用,只是一种类型的管控
c.类与构造函数
class People {
constructor(public name: string, public age: number) {
}
}
let Person : People = new People('名字', 18)
四、数组类型
1.使用泛型标注类型
let arr: Array<number> = [1, 2, 3]
arr.push(177)//ok
arr.push('字符串')//err
2.简单标注
let arr:string[]=['字符串1','字符串2']
arr.push('字符串3')//ok
arr.push(89)//error
五、元组类型
元组类似数组,但是其中的类型不必完全相同
let data: [string, number] = ['字符串', 1] //初始化时元素个数以及元素类型都必须与类型标注相同
data.push('字符串2')
六、枚举类型
给一组有关联的数据赋予一个友好的名字
// 数字型枚举定义
enum MEI_JU {
MEI_JU_ONE = 100,
MEI_JU_TWO = 200,
MEI_JU_THREE,
}
// 使用
MEI_JU.MEI_JU_ONE;
// 若没有赋值 则默认从0开始 没有赋值的项为上一项 +1 (如此处的MEI_JU.MEI_JU_THREE为201)
// 字符串型枚举定义
enum MEI_JU_STRING {
MEI_JU_ONE = '枚举字符串1',
MEI_JU_TWO = '枚举字符串2',
INDEX = 3,
}
// 使用
MEI_JU_STRING.MEI_JU_ONE;
// 注意:如果前一个枚举是字符串,则后面一个需要手动赋值
上面ts编译过后的JS为
// 数字型枚举定义
var MEI_JU;
(function (MEI_JU) {
MEI_JU[MEI_JU["MEI_JU_ONE"] = 100] = "MEI_JU_ONE";
MEI_JU[MEI_JU["MEI_JU_TWO"] = 200] = "MEI_JU_TWO";
MEI_JU[MEI_JU["MEI_JU_THREE"] = 201] = "MEI_JU_THREE";
})(MEI_JU || (MEI_JU = {}));
// 使用
MEI_JU.MEI_JU_ONE;
// 若没有赋值 则默认从0开始 没有赋值的项为上一项 +1 (如此处的MEI_JU.MEI_JU_THREE为201)
// 字符串型枚举定义
var MEI_JU_STRING;
(function (MEI_JU_STRING) {
MEI_JU_STRING["MEI_JU_ONE"] = "\u679A\u4E3E\u5B57\u7B26\u4E321";
MEI_JU_STRING["MEI_JU_TWO"] = "\u679A\u4E3E\u5B57\u7B26\u4E322";
MEI_JU_STRING[MEI_JU_STRING["INDEX"] = 3] = "INDEX";
})(MEI_JU_STRING || (MEI_JU_STRING = {}));
// 使用
MEI_JU_STRING.MEI_JU_ONE;
// 注意:如果前一个枚举是字符串,则后面一个需要手动赋值
意味着
可通过前者访问后者,也可通过后者访问前者
七、无值类型
常用于标注没有返回值的函数 void
function fun(): void {
// return为空或者return undefined都为void 如果没有开启严格类型检车return null也为void
}
let res = fun()
八、NEVER类型
当一个函数永远都不可能执行return的时候,比如抛出了一个错误导致函数执行结束,或者陷入死循环
function fun(): never {
throw new Error()
}
let a = fun()
九、任意类型
不确定时
- 任何值都可以赋值给any
- any可以赋值给任何值
- any具有所有属性和方法
但是程序中不推荐使用any,可以在tsconfig.json中添加 “noImplicitAny”: true来检查程序中的隐式any
十、未知类型
unknow仅能赋值给unkonw和any,属于安全版的any,没有任何属性和方法
十一、函数类型
function fun(x: number, y: number): number {
return x + y
}