范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

TypeScript的枚举与类型约束

  ● 上一章我们讲了 TS 的接口
  ● 这一章, 我们就来聊一聊 TS 的枚举和约束 枚举认识枚举
  ● 在很多计算机语言中都有枚举的概念, 但是 JS 中是没有枚举这个概念的, 为了弥补这个缺憾 在 TS 加入了枚举类型
  ● 什么是枚举呢 ?
  枚举( mei ju ) : 枚举的意思就是一一列举, 把所有情况都列举出来, 那么取值的时候, 只有这几个可以使用, 其他的都不行
  计算机语言里面的枚举( enumerations ) : 把所有的常量放在一个集合内, 让若干个常量变成一组有关联的内容
  // 针对一个业务逻辑, 我需要频繁用到四个方向的字符串 const UP = "up" const RIGHT = "right" const DOWN = "down" const LEFT = "left"
  ● 对于以上四个变量来说
  ● 我不管做任何逻辑, 我没办法限制你只能使用这四个变量中的一个 // 封装一个功能函数 function util(dir) {}
  ● 不管用什么方法, 你都没办法限制这个 dir 参数接收到的必须是上面列出的四个方向
  ● 这个时候, 我们就可以用到枚举了
  ● 首先, 在 TS 中, 利用 enum 关键字创建一个枚举集合, 把我们需要的四个常量放进去 enum Direction {   UP = "up",   RIGHT = "right",   DOWN = "down",   LEFT = "left" }
  ● 制作了一个 DIrection 枚举集合, 那么就可以用这个集合来对某些数据进行限制了 function util(dir: Direction) {}
  ● 这就约定了, dir 这个参数的值只能是 Direction 这个枚举集合里面的常量, 其他都不行
  ● 只要你写的不是 Direction 这个枚举内的内容都不行 数字枚举
  ● 数字枚举 : 枚举类型中的每一个常量都是数字
  ● 在 TS 中, 枚举内的每一个常量, 当你不设置值的时候, 默认就是 number 类型 enum Pages {     ONE,    // 0     TWO,    // 1     THREE   // 2 }
  ● 你在枚举内的常量, 第一个默认值是 0, 后面的依次 +1 递增
  此时
  Pages.ONE => 0
  Pages.TWO => 1
  Pages.THREE => 2
  ● 我们也可以自己指定值 enum Pages {     ONE = 10,    // 10     TWO = 20,    // 20     THREE = 30   // 30 }
  ● 这个时候枚举集合内的常量就是我们指定好的值
  ● 我们也可以指定部分值 enum Pages {     ONE = 10,    // 10     TWO,         // 11     THREE        // 12 }
  ● 指定常量后面的未指定常量, 就会按照 +1 的规则一次递增
  enum Pages {     ONE,         // 0     TWO = 10,    // 10     THREE        // 11 }enum Pages {     ONE,         // 0     TWO = 10,    // 10     THREE,       // 11     FOUR = 30,   // 30     FIVE         // 31 }字符串枚举
  ● 字符串枚举 : 枚举集合中的每一个常量的值都是 string 类型
  ● 在 TS 内, 你必须要指定一个值, 才可能会出现 string 类型 enum Direction {   UP = "up",   RIGHT = "right",   DOWN = "down",   LEFT = "left" }
  ● 在 TS 中, 枚举常量和任何内容都是不一样的, 包括原始字符串 function util(dir: Direction) {}
  ● 这是因为, 在 TS 中, 枚举内的每一个常量都是一个独一无二的值
  ● 所以当你用枚举去限定一个数据的时候, 用的时候也只能用枚举内的值
  ● 这样也避免你因为手误出现的单词错误, 比如你会不会认为 "form" 和 "from" 是一个单词呢 异构枚举
  ● 异构枚举 : 其实就是在一个枚举集合内同时混合了数字枚举和字符串枚举
  ● 但是你大概率是不会这样使用的, 因为我们作为一组数据的集合, 一般不会把数字和字符串混合在一起使用enum Info {   ONE,   UP = "up",   TWO = 2,   LEFT = "left" }
  ● 在这里有一个点需要注意
  因为在枚举集合内, 当某一个 key 你没有设置值的时候, 会默认按照上一个的值 +1
  所以如果前一个是 字符串枚举, 那么下一个必须要手动赋值, 不然会报错
  如果前一个是 数字枚举, 那么下一个可以不必要手动赋值, 会按照上一个 +1 计算枚举合并
  ● 在 TS 内的枚举, 是支持合并的
  ● 多个枚举类型可以分开书写, 会在编译的时候自动合并enum Direction {   UP = "up",   RIGHT = "right",   DOWN = "down",   LEFT = "left" }  enum Direction {   TOP = "top",   BOTTOM = "bottom" }  function util(dir: Direction) {}  util(Direction.BOTTOM) util(Direction.LEFT)
  ● 这里定义的两个枚举都叫做 Direction, 会在编译的时候自动放在一起, 不会出现冲突反向映射
  ● TS 内的数字枚举, 在编译的时候, 会同时将 key 和 value 分别颠倒编译一次enum Pages {     ONE,    // 0     TWO,    // 1     THREE   // 2 }
  ● 以这个为例, 他是如何进行编译的呢var Pages; (function (Pages) {     Pages[Enum["ONE"] = 0] = "ONE"     Pages[Enum["TWO"] = 1] = "TWO"     Pages[Enum["THREE"] = 2] = "THREE" })(Pages || (Pages = {}));
  ● 编译完毕的结果Pages = {     ONE: 0,     TWO: 1,     THREE: 2,     "0": "ONE",     "1": "TWO",     "2": "THREE" }
  ● 也就是说, 我们在 TS 内使用的时候, 如果是数字枚举
  ● 那么我们可以通过 key 得到对应的数字, 也可以通过对应的数字得到对应的 keyenum Pages {     ONE,    // 0     TWO,    // 1     THREE   // 2 }  console.log(Pages.ONE)    // 0 console.log(Pages.TWO)    // 1 console.log(Pages.THREE)  // 2 console.log(Pages[0])     // "ONE" console.log(Pages[1])     // "TWO" console.log(Pages[2])     // "THREE"常量枚举
  ● 常量枚举, 是在枚举的基础上再加上 const 关键字来修饰
  ● 会在编译的时候, 把枚举内容删除, 只保留编译结果
  ● 并且对于数字枚举来说, 不在支持反向映射能力, 只能利用 key 来访问
  ● 非常量枚举enum Pages {     ONE,    // 0     TWO,    // 1     THREE   // 2 }  console.log(Pages.ONE) console.log(Pages.TWO) console.log(Pages.THREE)
  ○ 编译完毕的 js 文件
  ● 常量枚举const enum Pages {     ONE,    // 0     TWO,    // 1     THREE   // 2 }  console.log(Pages.ONE) console.log(Pages.TWO) console.log(Pages.THREE)
  ○ 编译完毕的 js 文件
  类型约束
  ● 在 TS 中, 还有一个很神奇的关键字, 叫做 type
  ● type 又叫做类型别名有很多神奇的功能, 不仅能支持 interface 定义的对象结构, 还支持任何手写类型
  ● 先来看一个很简单的例子
  let n1: number | string | boolean let n2: number | string | boolean let n3: number | string | boolean
  ● 观察上面一段代码, 我们定义了 n1 和 n2 和 n3 三个变量
  ○ 对于类型的限制都是 number 或者 string 或者 boolean
  ● 写起来的时候就非常麻烦
  ● 这个时候, 我们就可以使用 type 对其进行别名设置type Info = number | string | boolean let n1: Info let n2: Info let n3: Info
  ● 这样一来, 我们的代码是不是变得简洁了起来
  ● 可能小伙伴们认为这个用的并不多, 但是 type 也不是只有这一个功能type 的常见使用
  ● 基本类型的别名type n = number let num: n = 100
  ○ 这是一个非常基础的使用, 把 number 这个类型起了一个别名叫做 n
  ○ 今后再用 n 来限制变量的时候, 其实就是在使用 number
  ● 基本类型联合type i = number | string let str: i = "千锋大前端" str = 100
  ○ 这就是联合类型, 那 number 或者 string 这个类型齐了一个别名叫做 i
  ○ 我们再用 i 来限制变量的时候, 这个变量就被限制为了 number 或者 string
  ● 对象类型type User = { name: string, age: number } let person: User = { name: "千锋大前端", age: 10 }
  ○ 这就是对象类型, 和 interface 很像, 用处基本一致
  ● 对象联合类型type User = { name: string, age: number } type Person = User & { gender: boolean } let person: Person = { name: "千锋大前端", age: 10, gender: true }
  ○ 这就是对象联合类型, 和 interface 的 extends 继承很像
  ● 元组类型type data = [ number, string ] let info: data = [ 10, "千锋大前端" ]
  ● 常量限定type color = "yellow" | "orange" | "blue" function util(c: color) {} util("yellow")
  ○ 这个 color 被限定为了几个值, 将来用 color 去约束一个变量的时候
  ○ 这个变量只能接受这几个值, 这里和 enum 比较像了
  type 和 interface 的共同点
  1. 都可以约束 对象 或者 函数 类型
  ○ interfaceinterface User { name: string; age: number } interface Func { (x: number): number }
  ○ typetype User = { name: string; age: number } type Func = (x: number) => number
  ○ 我们看到, 两个定义方式略有区别, 但是后期用法基本一致
  2. 扩展类型
  ○ interface 使用 extends 进行继承interface Person {     name: string     age: number }  // 使用 extends 关键字继承自 Person interface Student extends Person {     classRoom: number } let s: Student = { name: "千锋大前端", age: 10, classRoom: 1 }
  ○ type 使用 交叉(&) 来实现type Person = {     name: string     age: number }  // 使用 交叉(&) type Student = Person & {     classRoom: number } let s: Student = { name: "千锋大前端", age: 10, classRoom: 1 }
  3. 联合类型
  ○ interface 使用 extends 继承 typetype Person = {     name: string     age: number }  // 使用 extends 关键字继承自 Person interface Student extends Person {     classRoom: number } let s: Student = { name: "千锋大前端", age: 10, classRoom: 1 }
  ○ type 使用 交叉(&) 扩展 interfaceinterface Person {     name: string     age: number }  // 使用 交叉(&) type Student = Person & {     classRoom: number } let s: Student = { name: "千锋大前端", age: 10, classRoom: 1 }type 和 interface 的区别
  1. interface 支持多次声明自动合并, type 不支持interface User {     name: string     age: number } interface User {     classRoom: string } /*     真实的 User 接口     {         name: string         age: number         classRoom: string     } */
  ○ type 如果声明重名标识符会报错
  2. 对于 ES6 模块化语法的默认导出语法
  ○ interface 支持声明的同时进行默认导出export default interface User {     name: string     age: number }
  ○ type 必须先声明, 在默认导出type User = {     name: string     age: number } export default User
  ○ 必须要先声明好, 在进行默认导出, 如果直接连写默认导出, 会报错
  3. type 可以使用 typeof 关键字去获取某一数据类型let box = document.querySelector(".box") type EleType = typeof box
  ○ 这里定义了一个 EleType 标识符, 会自动根据 typeof 关键字检测的 box 的类型限制
  4. type 支持使用 in 关键字去遍历成映射类型type names = "firstName" | "lastName" | "AKA" type nameType = {     [key in names]: string } /*     真实的 nameType 类型     {         firstName: string         lastName: string         AKA: string     } */

周六起Y1路Y2路整合为B4路BRT高崎机场站到候机楼更便捷来源台海网台海网3月23日讯(海峡导报记者曾宇姗通讯员江安娜)厦门公交集团发布通告,3月25日起,结合疫情防控措施调整后的航空客流变化情况,方便旅客由BRT高崎机场站快速接驳高崎机36张图看世界朝鲜平壤最大的妓院,高丽航空的乘务员澳大利亚拥有世界最大的虚拟舞台之一,尺寸为10米x90米,由6000个LED面板实时创建高分辨率虚拟背景。1955年梅赛德斯奔驰300SL,座椅和门板都覆盖着柔软的皮革,呈现出经典汇丰晋信陆彬的2022错判新能源周期净值巨亏,试水港股尝到甜头2022年公募基金年报陆续发布,明星基金经理2020年股基冠军陆彬旗下四只产品也于近日首批曝光。2022年A股整体表现不佳,新能源赛道回撤明显,陆彬对此做了哪些反思与展望?在新能源新疆天业拟成立合资公司在石河子建设新能源项目天山网讯(记者王永飞冉虎报道)3月23日收盘时,新疆板块指数17235。33,跌幅0。35当日21只股票上涨,37只股票下跌,2只股票平盘,上涨率35当日总换手率1。25,总成交额谷爱凌落地上海直奔健身房时隔324天再次回国选择了一个最好的倒时差方式3月20日,北京冬奥会冠军谷爱凌在个人社交媒体发布照片称,自己回到了中国。自从谷爱凌在2022年4月30日乘飞机离开了中国,这一别已经时隔324天。冬奥会结束后,谷爱凌为赶赴斯坦福影驰携手育碧推出福利活动,购买游戏可以抽显卡在近期育碧开启了旗下的春季游戏大促活动,而作为DIY领域内的全球知名企业影驰也携手育碧的这一次春季游戏大促活动中进行了福利大派送,用户购买相关游戏将会获得相关硬件的抽奖,幸运的玩家闵行体育公园有条千米花道早樱盛放海棠又红,繁花立体绽放阳春三月,申城各大公园绿地中花开正盛,市民游客徜徉其中,尽享移步换景,感受满目芬芳。2023年3月22日,申城时有细雨,气候温润,适合户外踏青。上海西南最大绿肺闵行体育公园内千米花庐山邂逅江南雪来源人民网人民日报海外版null江西庐山风景区雪景旖旎。陈思伟摄(人民图片)冬季旅游,最美莫过于赏雪。江西庐山雪景,铺琼砌玉,堪称一绝。前些日子,我游览庐山,一场大雪簌簌飘落,整个二顺子媳妇徐巧云回门宴,豪做32个菜,茅台舍得等好酒轮番上不知不觉二顺子结婚已经过去4天了,按照当地的风俗习惯,婚后第四天是新娘回门的日子,这一天娘家人要派人来接,主家要大摆宴席,宴请贵客。不看不知道,一看吓一跳。徐巧云回门宴中,豆二两豪大同兔头,是山西大同特色传统小吃!大同兔头,是山西大同特色传统小吃,属于典型的北方菜式,具有多种口味,且味道独特。大同兔头不同于四川的麻辣兔头,它的制作各式各样,主要有麻辣红焖五香等多种口味。其中,最受大同人喜爱的做了1个动作,传统公司改变销售模式,业绩提升3倍!尽管数字化转型在传统行业中面临着很多挑战,但这些挑战并不意味着数字化转型就无法成功。市场上仍有很多传统企业,通过商业模式的升级,为企业发展来带来了新的机遇。刘生在计量检测行业深耕多
OPPO官方视频翻车背后,可能是地主家也没有余粮了日前OPPO在某短视频平台上的官方账号OPPO官方直播间发布的一段介绍手机的视频不幸出现了翻车事故。有眼尖的网友发现在主播展示的OPPO手机上,手机名称被命名为买OPPO的都是X笔将来的世界斯诺克职业赛场是中国人的天下吗?斯诺克是英国人的天下吗?非常有趣的斯诺克球员的绰号!十几年前自从中国出了个丁俊晖,我就爱上了斯诺克这项运动,只要有中国选手参加的国际赛事都要看个够,非常遗憾!只是在电视上看,从没有快报记者对话飞夺泸定桥式救援消防员,只想以最快速度转移出重伤者现代快报讯(记者王瑞)9月6日下午,一段四川甘孜地震灾区消防员飞夺泸定桥般的救援画面,感动了无数网友。6日晚,现代快报记者联系上了参与现场救援的甘孜州森林消防支队雅江县森林消防大队不出远门,三条精品线路!海湾一日游打卡线路来了山川湖海,天地与爱。我们在不同风景,相同时光里。路人穿街过河,好景只有片刻。有趣的人生,一半是家常里短,一半是山川湖海。趁阳光正好,趁微风不噪,趁繁花还未开至荼蘼,让我们在海湾来一新华财经露营热引领旅游新风尚精品营地亮相2022年服贸会新华社北京9月6日电(记者董道勇)在2022年中国国际服务贸易交易会上,房车帐篷户外蛋卷桌咖啡炉卡式炉露营灯氛围灯等热门户外装备吸引着众多展客商驻足了解。最新的露营产品热门的露营地国庆节放几天?去哪里旅游?北京市人民政府办公厅9月7日发布关于2022年国庆节放假安排的通知根据国务院办公厅通知精神,现将2022年国庆节放假安排通知如下10月1日至7日放假调休,共7天。10月8日(星期六贵州化屋村黔山秀水好风光乡村振兴路更广站上观景台,俯瞰乌江源百里画廊,层层云雾之中,特色民居鳞次栉比山水风光旖旎如画游船行过碧波荡漾,往来其间的游客络绎不绝。这里,是贵州省毕节市黔西市(2021年5月10日撤县设市)新辽源市硅泉谷一眼地下泉激活乡村游来源人民网吉林频道硅泉谷山庄位于辽源市龙山区寿山镇礼让村三组,占地面积800亩。依托得天独厚的生态资源及乡村自然景观,依山就势而建。走进山庄,满眼绿意,错落有致的庭院,只闻鸟鸣不见这家有争议的以色列人脸识别公司,把生意做进了美国各大赌场以色列的面部识别技术正被用于美国的各大赌场里,这引起了人们对私营机构将如何使用强大监控工具的担忧。文ThomasBrewster每一天,俄克拉荷马州塔尔萨市河灵赌场(RiverSp在华为Mate50实现卫星功能后,谷歌随后也将在Android14布局华为Mate50于今天下午时段已发布,比较遗憾的是依然没有麒麟芯片,米国这次对华为的制裁伤害实在是太大,即便已经过了3年依然没能缓过来。不过此次发布会也不是完全没亮点,此前大力宣传城市副中心打造北京服务业高质量发展高水平开放重要窗口人民网北京9月6日电(李博)在两区政策叠加优势下,我们正努力把城市副中心打造成为北京市服务业高质量发展和高水平开放的重要窗口,副中心也依托独有的资源禀赋,持续释放出全面强劲的发展优