在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
javascript中有7种数据类型,分别是:boolean,number,string,null,undefined和object,以及在es6中新增的一种类型 symbol。而typescript又在此基础上增加了一些类型,接下来一个个来看。
元组元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同,例如: let a: [string, number] a = ['hello', 1] a=[1,'hello'] //Error Type 'number' is not assignable to type 'string'... a=['hello'] //Error Property '1' is missing in type '[string]' but required in type '[string, number]'. a=['hello',1,1] //Error Type '[string, number, number]' is not assignable to type '[string, number]'. 上面定义了一个长度为2的元组,且每个元素的类型是固定的,当赋值时,各个位置上的元素类型都要对应,元素个数也要一致,不然会报编译错误。
关于赋值时超出所定义的长度的问题,这在2.6版本之前是被允许的,即上面 a=['hello,1,1] 这样在2.6版本之前是可行的,此时 interface StrNumTuple extends Array<string | number> { 0: string; 1: number; length: 2; // using the numeric literal type '2' } 参考:https://www.tslang.cn/docs/release-notes/typescript-2.7.html
我们也可以对元组上的单个元素赋值: let a: [string, number] a = ['hello', 1] a[1] = 3 因为位置 1 上的类型是数字,所以可以重赋值为3
当我们访问元组中元素时,会对我们在元素上做的操作进行检查: let a: [string, number] a = ['hello', 1] a[0].split('') a[1].split('') //Error Property 'split' does not exist on type 'number'. 1位置上是数字类型,所以不可以使用split方法。
枚举
enum Roles { ADMIN, EDITOR, USER } let role: Roles = Roles.USER console.log(role) // 2
枚举里的每个值都有编号,默认从0开始,依次排列,所以上面例子里打印了2。你也可以修改编号,比如你希望编号从3开始,就可以定义为: enum Roles { ADMIN = 3, EDITOR, USER } let role: Roles = Roles.USER console.log(role) //5
当然你也可以为每个值都赋予不同的,不按顺序排列的值: enum Roles { ADMIN = 3, EDITOR = 7, USER = 1 } let role: Roles = Roles.USER console.log(role) // 1
我们除了可以通过名字得到值,也可以通过值得到名字: enum Roles { ADMIN = 3, EDITOR = 7, USER = 1 } // 注意这里指定为string类型,名字是string类型 let role: string = Roles[3] console.log(role) // ADMIN
Any顾名思义,使用这个类型定义后,变量可以是任意值,这跟直接使用原生javascript开发是一样的。当我们不清楚某一变量会是什么类型时,可以使用any类型来通过编译 let a: any = 'hello' a = 1 a = false a = [1, 2] 如上代码,使用any定义类型后,可以任意类型赋值。
有时候用在数组定义上可能是很有用的 let arr: any[] = [1, 'hello', false] arr[0] = 'hi'
可以看到使用any类型时会让编码变得很灵活,但是这就失去了使用typescript的意义,毕竟我们就是要摆脱这种灵活才选择用typescript的。所以尽量能不用any就不用any吧。
Void某种程度上来说, function fn(): void { console.log('hello world') }
声明一个 let a: void = undefined let b: void = null // Type 'null' is not assignable to type 'void'. 确实可以赋值为 undefined,但是赋值为 null 时报错了,我以为是文档写错了,但去看了英文文档后发现是这样的: 要想赋值为 null 时不报错,在tsconfig.json文件里找到 strictNullChecks 选项,去掉注释,值改为false,保存后重编译就没问题了。
Nevernever表示的是哪些永不存在的值的类型。它可以是那些总会抛出异常或者根本不会有返回值的函数表达式的返回值类型,也可以是变量的类型,此时变量被永不为真的类型保护所约束。 function error():never{ throw new Error('异常') } 上面函数总是抛出异常,所以它的返回值类型是never,表示永远不会有返回值 function func():never{ while(true){} } 这段代码里的函数也是永远没有返回值,返回值类型也是never。它与void类型不一样,函数若是不想返回值需要指定void类型,未指定的都必须有返回值。
|
请发表评论