当前位置: 首页 > news >正文

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

目录

理解 'as const'

TypeScript的期望与现实

解决方案:'as const'

与 object.freeze 的比较

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

使用 'as const' 提取对象值

基于Vue3.0的优秀低代码项目

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

理解 'as const'

以下是一个没有 as const 的代码片段:

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

这个TypeScript的世界里,这个变量可以随心所欲地变化和改变。听起来很灵活,,但是这里有个陷阱。

请考虑这个 go to root 方法:

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

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

as const 可以为我们解决这个问题。

TypeScript的期望与现实

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

这里有个例子。假设你有一个对象,你期望TypeScript只考虑这个对象的属性。但是,意外的是!TypeScript只把它当作一个字符串来考虑。

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

在这种情况下,TypeScript认为 route 是一个可能会发生变化的字符串。但是,我们希望基于属性的固定类型。我们的期望和现实并未对齐。

解决方案:'as const'

我们刚刚经历的那种痛苦的分歧,就是 as const 试图解决的问题。通过将易变属性改为不变属性, as const 使我们的期望与现实保持一致。

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

通过这个简单的改变,我们的对象属性变成了只读。我们看看它如何影响我们之前的问题:

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

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

与 object.freeze 的比较

你可能对JavaScript方法 Object.freeze() 有所了解。 Object.freeze() 和 as const 都可以使对象只读,但它们之间存在着关键的差异。

我们快速了解一下他们的能力:

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

以及一些结果:

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

通过 Object.freeze() ,我们拥有了一个运行时概念,可以防止JavaScript对象的更改。然而, Object.freeze() 并不影响 TypeScript 的类型推断。

另一方面,有了 as const ,TypeScript在编译时将对象视为不可变的,使你的类型检查更为严格,这有助于捕捉更多可能的错误。

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

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

我们使用 as const 重构 goTo 函数:

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

就这样,as const 使我们免于重复信息的愚蠢操作。我们可以从我们创建的对象中推断出一个类型。这样是不是更简洁了?

使用 'as const' 提取对象值

我们使用 as const 提取我对象值,颠覆TypeScript的规则,获取我们需要的所有详细信息,以编写强大且无bug的代码。这只需要一点类型魔法。

以下是一个示例:

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

基于Vue3.0的优秀低代码项目

JNPF开发平台是一个基于SpringBoot+Vue3的全栈开发平台,采用微服务、前后端分离架构。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,满足快速开发;框架集成了表单、报表、图表、大屏等各种常用的Demo方便直接使用;后端框架支持Vue2、Vue3;平台即可私有化部署,也支持K8S部署。

JNPF 快速开发平台的 Vue3.0 版本是基于 Vue3.x、Vue-router4.x、Vite4.x、Ant-Design-Vue3.x、TypeScript、Pinia、Less 的后台解决方案,采用 Pnpm 包管理工具,旨在为中大型项目做开发,提供开箱即用的解决方案。前端同时适配Vue2/Vue3技术栈。

如果你是一名开发者,可以试试JNPF开发平台。基于低代码充分利用传统开发模式下积累的经验,高效开发。

这边放上地址。官网:https://www.jnpfsoft.com/?csdn

相关文章:

  • windows系统自动更新中断电导致系统无法开启
  • 单独封装export default .js 在引入
  • VSCode修改主题为Eclipse 绿色护眼模式
  • 使用easyui前端框架快速构建一个crud应用
  • 02-PostgreSQL的基本使用
  • cmake vs2022编译opencv4.5.2 x86 版本
  • vue3 开启 https
  • 机器学习实战——《跟着迪哥学Python数据分析与机器学习实战》
  • java压缩pdf体积,图片体积
  • OpenCV实现手势虚拟拖拽
  • vue+java实现语音转文字思路
  • 通信原理板块——图像压缩编码
  • 红包算法 java实现
  • Go语言的Json序列化与反序列化、Goto语法、Tcp Socket通信
  • 【脑机接口 算法】EEGNet: 通用神经网络应用于脑电信号
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【剑指offer】让抽象问题具体化
  • ➹使用webpack配置多页面应用(MPA)
  • es6--symbol
  • fetch 从初识到应用
  • HTTP请求重发
  • Java 网络编程(2):UDP 的使用
  • Javascript Math对象和Date对象常用方法详解
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • MySQL-事务管理(基础)
  • Mysql优化
  • node入门
  • Node项目之评分系统(二)- 数据库设计
  • Vue.js源码(2):初探List Rendering
  • 代理模式
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 手机端车牌号码键盘的vue组件
  • 算法系列——算法入门之递归分而治之思想的实现
  • 怎么把视频里的音乐提取出来
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (1)SpringCloud 整合Python
  • (13):Silverlight 2 数据与通信之WebRequest
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)关于多人操作数据的处理策略
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .dwp和.webpart的区别
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET MVC第三章、三种传值方式
  • .NET 回调、接口回调、 委托
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化