72小时带你光速入门TypeScript - 枚举与接口
距离我上一次更新到目前为止差不多2个月了,这2个月不是故意断更,是真的忙到飞起,忙到抽不出任何时间来写技术文章,至于为啥这么忙?如果大家有兴趣,可以到我的文章列表里搜一搜,如果你能搜到那篇文章,希望我的经历可以对你有启发。好了,废话不多说,我们还是聊一聊Ts吧。
在之前的文章里,我们讲到了基本数据类型如何使用Ts做类型校验,在Ts里,为了能够让类型校验看起来更丰富,Ts官方增加了很多的其他语法糖来帮助我们做更精准的控制。但是说实话,如果你写代码有类型控制的习惯,你觉得还有必要使用Ts吗?
枚举
如果你的值是一个明确且有限的范围,那么这个值的类型就叫做枚举。语法如下:
enum [你要定义的类型名字] {
key = value
}
使用如下:
enum e1 {
One = '1',
Two = '2'
}
let e2:e1 = e1.One;
console.log('e1的值:', e2);
这个知识点到这里就结束了,是不是很简单~~
接口
接口这个概念大家应该都不陌生,关键字interface。语法如下:
interface [接口名字] {
...一些类型校验
}
它可以用来校验一切引用数据类型,比如对象、函数、数组。
接口校验对象
先看一段代码:
interface if1 {
a: string,
b: number
}
let obj1:if1 = {
a: '1',
b: 2
}
上面这段代码,我们定义了一个接口if1,因为obj1对象的检验类型是if1,所以obj1里的key必须是a、b,并且key对应的value类型还要对应上。
但是在实际工作中,一般不会有人这么使用,因为在写业务代码的时候,说实话我们不会去管一个Object里会有多少个key,我们也不知道一个Object里到底会有多少个key,总之是越多越好,这个时候你可以像下面这样写:
interface if1 {
[propsName: string | symbol]: any
}
let obj1:if1 = {
a: 1,
b: 2,
[Symbol(c)]: 3,
}
这样,obj1就可以拥有任意数量的key了,你也终于可以放心大胆的操纵对象了。
我们再回到下面这种写法:
interface if1 {
[propsName: string | symbol]: any
}
其中,propsName
这个名字并不是固定的,你可以将它换成任何名字,完全看自己心情。这种写法在Ts里被叫做“索引签名”。感兴趣的小伙伴可以自行查阅资料,不在这里过多赘述。
接口校验函数
语法如下:
interface fnInterface {
(source1: string, source2: number): boolean
}
let f1: fnInterface;
f1 = (s1: string, s2: number) => {
return true;
}
上述代码中,fnInterface接口定义了函数拥有2个参数,第一个参数的类型是string类型,第二个参数的类型是number类型,返回值是boolean类型。
因为f1函数的类型是fnInterface接口,因此f1函数的第一个参数类型必须是string,第二个参数类型必须是number,返回值必须是boolean。至于参数名字是否跟fnInterface接口定义的一致,这倒是大可不必,不强求。
再多说一句,下面的接口就不能用作单纯的函数校验,因为下面的接口里有多种类型校验,此时的它就只能用作对象校验。
interface fnInterface {
(source1: string, source2: number): boolean,
[propsName: string]: any
}
接口校验数组
在之前的文章里,我们讲过,如果数组里各项的value
对应的数据类型一致,你可以像下面这样去做校验:
let arr:String[] = ['1', '2'];
如果 数组里各项的value
对应的数据类型不一致,你可以像下面这样去做校验:
let arr:any = [1, '2', undefined];
或者使用元组:
let arr:[string, number, undefined] = ['1', 2, undefined];
当然,由于“索引签名”这个概念,你也可以使用interface来实现,因为数组本质上也是对象,也是key:value的形式,并且这种情况下,key的类型始终都是number,代码如下:
interface array1 {
[index: number]: any
}
let arr:array1 = [1, 2, '3'];
最后
好啦,本次分享到这里就结束啦,我们下期再见啦,拜拜~~
转载自:https://juejin.cn/post/7380366595305144329