当前位置:首页 > 科技  > 软件

As Const:一个被低估的 TypeScript 特性

来源: 责编: 时间:2023-11-09 09:14:29 349观看
导读你有没有感觉 TypeScript中可能有一些被低估但却非常有用的工具,你并没有充分利用?的确有,今天我们要重点介绍一个:as const。它虽然沉默却强大,而且非常有力,是一个被低估的功能,但它的力量却强大无比。理解 'as const'以下

KRZ28资讯网——每日最新资讯28at.com

你有没有感觉 TypeScript中可能有一些被低估但却非常有用的工具,你并没有充分利用?的确有,今天我们要重点介绍一个:as const。它虽然沉默却强大,而且非常有力,是一个被低估的功能,但它的力量却强大无比。KRZ28资讯网——每日最新资讯28at.com

理解 'as const'

以下是一个没有 as const 的代码片段:KRZ28资讯网——每日最新资讯28at.com

const menu = {    home: '/home',    about: '/about',    contact: '/contact'};

这个TypeScript的世界里,这个变量可以随心所欲地变化和改变。听起来很灵活,,但是这里有个陷阱。KRZ28资讯网——每日最新资讯28at.com

请考虑这个 go to root 方法:KRZ28资讯网——每日最新资讯28at.com

function goTo(route: 'home' | 'about' | 'contact') {    // some implementation}

注意到了吗?如果你在 menu 对象中添加了另一条路由,你也需要更新函数 goTo 。这就是冗余,导致同一类型有多个真实来源。KRZ28资讯网——每日最新资讯28at.com

as const 可以为我们解决这个问题。KRZ28资讯网——每日最新资讯28at.com

TypeScript的期望与现实

当你在使用TypeScript时,有时你所期待的和实际发生的情况会痛苦地产生巨大的分歧。当我们试图从现有的类型中创建一个新的类型时,这种分歧变得非常明显。KRZ28资讯网——每日最新资讯28at.com

这里有个例子。假设你有一个对象,你期望TypeScript只考虑这个对象的属性。但是,意外的是!TypeScript只把它当作一个字符串来考虑。KRZ28资讯网——每日最新资讯28at.com

let route: keyof typeof menu;route = 'store'; // No error

在这种情况下,TypeScript认为 route 是一个可能会发生变化的字符串。但是,我们希望基于属性的固定类型。我们的期望和现实并未对齐。KRZ28资讯网——每日最新资讯28at.com

解决方案:'as const'

我们刚刚经历的那种痛苦的分歧,就是 as const 试图解决的问题。通过将易变属性改为不变属性, as const 使我们的期望与现实保持一致。KRZ28资讯网——每日最新资讯28at.com

const menu = {   home: '/home',   about: '/about',   contact: '/contact' } as const;

通过这个简单的改变,我们的对象属性变成了只读。我们看看它如何影响我们之前的问题:KRZ28资讯网——每日最新资讯28at.com

let route: keyof typeof menu; route = 'store'; // Error. Exactly what we wanted!

通过使用 as const 使对象变为不可变,TypeScript 现在明白 route 应该只允许提供的键。现在,我们得到了我们想要的确切结果:当我们试图设置无效值时,会出现类型错误。KRZ28资讯网——每日最新资讯28at.com

与 object.freeze 的比较

你可能对JavaScript方法 Object.freeze() 有所了解。 Object.freeze() 和 as const 都可以使对象只读,但它们之间存在着关键的差异。KRZ28资讯网——每日最新资讯28at.com

我们快速了解一下他们的能力:KRZ28资讯网——每日最新资讯28at.com

const menuFrozen = Object.freeze({    home: '/home',    about: '/about',    contact: '/contact'});const menuConst = {    home: '/home',    about: '/about',    contact: '/contact'} as const;

以及一些结果:KRZ28资讯网——每日最新资讯28at.com

// 这不会改变任何东西,home 仍然是'/home'menuFrozen.home = '/newHome';// 编译时错误menuConst.home = '/newHome';

通过 Object.freeze() ,我们拥有了一个运行时概念,可以防止JavaScript对象的更改。然而, Object.freeze() 并不影响 TypeScript 的类型推断。KRZ28资讯网——每日最新资讯28at.com

另一方面,有了 as const ,TypeScript在编译时将对象视为不可变的,使你的类型检查更为严格,这有助于捕捉更多可能的错误。KRZ28资讯网——每日最新资讯28at.com

因此,虽然 as const 和 Object.freeze() 在表面上看起来可能相似,但它们服务于不同的目的。 as const 在类型检查上更为强大,而 Object.freeze() 只在运行时强制实施不变性。KRZ28资讯网——每日最新资讯28at.com

一个配合 'as const' 的更清洁的 'go to root' 函数

我们使用 as const 重构 goTo 函数:KRZ28资讯网——每日最新资讯28at.com

function goTo(route: keyof typeof menu) {      // some implementation}

就这样,as const 使我们免于重复信息的愚蠢操作。我们可以从我们创建的对象中推断出一个类型。这样是不是更简洁了?KRZ28资讯网——每日最新资讯28at.com

使用 'as const' 提取对象值

我们使用 as const 提取我对象值,颠覆TypeScript的规则,获取我们需要的所有详细信息,以编写强大且无bug的代码。这只需要一点类型魔法。KRZ28资讯网——每日最新资讯28at.com

以下是一个示例:KRZ28资讯网——每日最新资讯28at.com

type Routes = typeof menu[keyof typeof menu]; // Routes is now equal to '/home' | '/about' | '/contact'

KRZ28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-17890-0.htmlAs Const:一个被低估的 TypeScript 特性

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: SpringCloud OpenFeign整合Ribbon实现负载均衡及源码分析

下一篇: Python中的双下划线:特殊方法和属性的魔法世界!

标签:
  • 热门焦点
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为“纯欲天花板”的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大“烤”之下的除了众生,还有各大企业发布的ESG报告。ESG是“环境保
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的“征求意见版”:1、取消P序列
  • 郭明錤称华为和江淮汽车合作开发问界MPV,定价100万左右、计划明年量产

    8 月 1 日消息,郭明錤今天在 Medium 平台发布博文,称华为正在和江淮汽车合作,开发售价在 100 万元的问界 MPV,预计在 2024 年第 2 季度量产,销量目标为
  • Windows 11发布,微软一改往常对老机型开放的态度

    距离 Windows 11 发布已经过去一周,在过去一周里,很多数码爱好者围绕其对 Android 应用的支持、对老机型的升级问题展开了激烈讨论。与以往不同的是,在这次大
  • onebot M24巧系列一体机采用轻薄机身设计,现已在各平台开售

    onebot M24 巧系列一体机目前已在线上线下各平台同步开售。onebot M24 巧系列采用一体化轻薄机身设计,最薄处为 10.15mm,拥有宝石红、午夜蓝、石墨绿、雅致
  • 微软发布Windows 11新版 引入全新任务栏状态

    近日,微软发布了Windows 11新版,而Build 22563更新主要引入了几周前曝光的平板模式任务栏等,系统更流畅了。更新中,Windows 11加入了专门针对平板优化的任务栏
Top