likes
comments
collection
share

72小时带你光速入门TypeScript - 枚举与接口

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

距离我上一次更新到目前为止差不多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
评论
请登录