简单聊聊TypeScript只读修饰符


Posted in Javascript onApril 06, 2022

前言

在Typescript 2.0中,引入了readonly关键字,可以对类中的属性进行修饰,作用是:该属性被readonly修饰之后无法修改**(如需修改,在构造函数中可以对只读属性进行修改)**。

我们可以直接在interfacetype中直接使用readonly。

我们来看一个简单的例子:我们定义一个User type

type User={
   readonly  name : string;
   readonly  age  : number
}

我们可以创建一个user,并且初始化一个具体的值。

let user:User={
    name:'搞前端的半夏',
    age:18
}

如果我们去修改age的值,编译器会直接报错。

user.age=19

简单聊聊TypeScript只读修饰符

只读函数参数

在JS中,我们会经常使用const来定义变量,但是const无法保证Object内部的属性不被改变。还是上面的User type,

我们有一个函数接受User type的参数。我们在函数内部修改age属性,编译直接出错。

这样的好处是:我们可以确定这里定义的全局user,无法被改变

let user:User={
    name:'搞前端的半夏',
    age:18
}
UserInfo(user)
function UserInfo(user:User){
    user.age=19
    console.log(user.name,user.age)
}

简单聊聊TypeScript只读修饰符

如何更改函数

只读类属性

readonly修饰符还可以应用在类中声明的属性。这里我们创建了一个User类,具有只读的name和age,请注意这里的name和age是没有初始值的。

class User {
    readonly name: string;
    readonly age: number;
    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }
    UserInfo(user:User){
        console.log(user.name,user.age)
    }
}

我们创建一个user实体,使用new方法创建对象的同时,给name和age添加默认值,由此可以得出结论

在类的constructor中,我们可以修改只读属性的值

name和age是只读的,我们可以获取具体的值。

let user =new User('搞前端的半夏',18)

console.log(user.name)
console.log(user.age)

但是,如果尝试修改name和age的值,会编译出错。

简单聊聊TypeScript只读修饰符

我们尝试在UserInfo中修改name和age:

UserInfo(user:User){
        this.age=20
        console.log(user.name,user.age)
    }

可以看到,编译仍然是错误的!我们可以得出结论

在类中的普通方法 无法 修改 被readonly的属性

简单聊聊TypeScript只读修饰符

只读索引

可以使用readonly来标记索引。例如下面的ReadonlyArray,可以有效的防止给具体的索引分配具体的值。

interface ReadonlyArray<T> {
  readonly length: number;
  // ...
  readonly [n: number]: T;
}

因为是只读的索引,所以下面的赋值操作,会编译出错。

const readonlyArray: ReadonlyArray<number> = [2, 3, 5, 7];
readonlyArray[4] = 11;

简单聊聊TypeScript只读修饰符

总结

readonly是TS类型系统的一部分,它只是一个编译时的工具,TypeScript 代码被编译为 JavaScript,所有的readonly都消失了。所以在运行时没有任何针对属性只读的保护。TS是通过编译器来检查并帮助你编写正确的代码。

例如下面的示例,即使我们的编译器提示有错误,TS仍然可以编译成对应的JS代码,这也完全说明TS只是在编译的阶段,引导我们规范正确的编码

简单聊聊TypeScript只读修饰符

到此这篇关于TypeScript只读修饰符的文章就介绍到这了,更多相关TS只读修饰符内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
用Javascript数组处理多个字符串的连接问题
Aug 20 Javascript
jquery1.83 之前所有与异步列队相关的模块详细介绍
Nov 13 Javascript
jquery中的过滤操作详细解析
Dec 02 Javascript
jquery prop的使用介绍及与attr的区别
Dec 19 Javascript
JavaScript实现控制打开文件另存为对话框的方法
Apr 17 Javascript
jQuery实现自动切换播放的经典滑动门效果
Sep 12 Javascript
基于jQuery实现表格的查看修改删除
Aug 01 Javascript
浅谈DOM的操作以及性能优化问题-重绘重排
Jan 08 Javascript
JS中appendChild追加子节点无效的解决方法
Oct 14 Javascript
jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析
Mar 06 jQuery
vue router导航守卫(router.beforeEach())的使用详解
Apr 19 Javascript
jQuery实现回到顶部效果
Oct 19 jQuery
关于JS中的作用域中的问题思考分享
JavaScript中的LHS和RHS分析详情
vue中控制mock在开发环境使用,在生产环境禁用方式
Apr 06 #Vue.js
vue3使用vuedraggable实现拖拽功能
vue整合百度地图显示指定地点信息
vue中使用mockjs配置和使用方式
VUE使用draggable实现组件拖拽
Apr 06 #Vue.js
You might like
了解Joomla 这款来自国外的php网站管理系统
2010/03/11 PHP
关于WordPress的SEO优化相关的一些PHP页面脚本技巧
2015/12/10 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
PHP检测接口Traversable用法详解
2017/12/29 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
2018/10/18 PHP
jquery 学习笔记一
2010/04/07 Javascript
利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
2010/07/24 Javascript
如何在一个页面显示多个百度地图
2013/04/07 Javascript
node.js中的fs.fchownSync方法使用说明
2014/12/16 Javascript
Javascript中获取对象的原型对象的方法小结
2015/02/25 Javascript
jQuery带进度条全屏图片轮播特效代码分享
2020/06/28 Javascript
jQuery如何获取动态添加的元素
2016/06/24 Javascript
node+experss实现爬取电影天堂爬虫
2016/11/20 Javascript
js实现横向拖拽导航条功能
2017/02/17 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
前端防止用户重复提交js实现代码示例
2018/09/07 Javascript
6行代码实现微信小程序页面返回顶部效果
2018/12/28 Javascript
使用vuex存储用户信息到localStorage的实例
2019/11/11 Javascript
Python文件右键找不到IDLE打开项解决办法
2015/06/08 Python
深入浅析python 中的匿名函数
2018/05/21 Python
Python列表list操作相关知识小结
2020/01/29 Python
python中rc1什么意思
2020/06/19 Python
python如何安装下载后的模块
2020/07/03 Python
Python绘制K线图之可视化神器pyecharts的使用
2021/03/02 Python
MVMT手表官方网站:时尚又实惠的高品质手表
2016/12/04 全球购物
农业大学毕业生的个人自我评价
2013/10/11 职场文书
党员党性分析材料
2014/02/17 职场文书
调研汇报材料范文
2014/08/17 职场文书
竞选班干部演讲稿400字
2014/08/20 职场文书
幼儿园教师师德师风演讲稿:我自豪我是一名幼师
2014/09/10 职场文书
六五普法宣传标语
2014/10/06 职场文书
2015年电气技术员工作总结
2015/07/24 职场文书
乡镇司法所2015年度工作总结
2015/10/14 职场文书
优秀党员主要事迹材料
2015/11/04 职场文书
以下牛机,你有几个
2022/04/05 无线电
win10清理dns缓存
2022/04/19 数码科技