简单聊聊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对象之间的转换 jQuery对象和原声DOM
Mar 07 Javascript
jquery实现简单易懂的图片展示小例子
Nov 21 Javascript
jQuery回调函数的定义及用法实例
Dec 23 Javascript
jQuery实现个性翻牌效果导航菜单的方法
Mar 09 Javascript
javascript制作2048游戏
Mar 30 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
Jun 19 Javascript
浅谈angularJS的$watch失效问题的解决方案
Aug 11 Javascript
vue实现手机号码抽奖上下滚动动画示例
Oct 18 Javascript
js自定义input文件上传样式
Oct 26 Javascript
vue组件之间通信方式实例总结【8种方式】
Feb 22 Javascript
微信小程序点击item使之滚动到屏幕中间位置
Mar 25 Javascript
javascript前端和后台进行数据交互方法示例
Aug 07 Javascript
关于JS中的作用域中的问题思考分享
JavaScript中的LHS和RHS分析详情
vue中控制mock在开发环境使用,在生产环境禁用方式
Apr 06 #Vue.js
vue3使用vuedraggable实现拖拽功能
vue整合百度地图显示指定地点信息
vue中使用mockjs配置和使用方式
VUE使用draggable实现组件拖拽
Apr 06 #Vue.js
You might like
php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
2012/07/01 PHP
php 验证码(倾斜,正弦干扰线,黏贴,旋转)
2013/06/29 PHP
PHP中ini_set与ini_get用法实例
2014/11/04 PHP
PHP中md5()函数的用法讲解
2019/03/30 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
2019/05/14 PHP
javascript 动态数据下的锚点错位问题解决方法
2008/12/24 Javascript
javascript遍历控件实例详细解析
2014/01/10 Javascript
js获取日期:昨天今天和明天、后天
2014/06/11 Javascript
javascript中数组array及string的方法总结
2014/11/28 Javascript
jquery实现公告翻滚效果
2015/02/27 Javascript
jquery 构造函数在表单提交过程中修改数据
2015/05/25 Javascript
Javascript 计算字符串在localStorage中所占字节数
2015/10/21 Javascript
JavaScript常用数组算法小结
2016/02/13 Javascript
jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
2016/06/12 Javascript
Javascript 调用 ActionScript 的简单方法
2016/09/22 Javascript
微信小程序  audio音频播放详解及实例
2016/11/02 Javascript
简单谈谈关于Angular Cli打包的事
2017/09/05 Javascript
javascript、php关键字搜索函数的使用方法
2018/05/29 Javascript
微信小程序页面传多个参数跳转页面的实现方法
2019/05/17 Javascript
扫微信小程序码实现网站登陆实现解析
2019/08/20 Javascript
Node配合WebSocket做多文件下载以及进度回传
2019/11/07 Javascript
ES6 Iterator遍历器原理,应用场景及相关常用知识拓展详解
2020/02/15 Javascript
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python实现根据主机名字获得所有ip地址的方法
2015/06/28 Python
Python导入oracle数据的方法
2015/07/10 Python
Python用imghdr模块识别图片格式实例解析
2018/01/11 Python
浅谈python正则的常用方法 覆盖范围70%以上
2018/03/14 Python
搭建pypi私有仓库实现过程详解
2020/11/25 Python
移动端Web页面的CSS3 flex布局快速上手指南
2016/05/31 HTML / CSS
CSS3 rgb and rgba(透明色)的使用详解
2020/09/25 HTML / CSS
家居设计专业个人自荐信范文
2013/11/26 职场文书
竞选大队委员演讲稿
2014/04/28 职场文书
微电影大赛策划方案
2014/06/05 职场文书
戒毒悔改检讨书
2014/09/21 职场文书
2014年化妆品销售工作总结
2014/12/01 职场文书
Golang二维数组的使用方式
2021/05/28 Golang