简单聊聊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 相关文章推荐
JSON 入门指南 想了解json的朋友可以看下
Aug 26 Javascript
JavaScript时间转换处理函数
Apr 14 Javascript
Vue.js报错Failed to resolve filter问题的解决方法
May 25 Javascript
jQuery EasyUI tree 使用拖拽时遇到的错误小结
Oct 10 Javascript
jQuery插件fullPage.js实现全屏滚动效果
Dec 02 Javascript
JQuery.dataTables表格插件添加跳转到指定页
Jun 09 jQuery
微信小程序利用canvas 绘制幸运大转盘功能
Jul 06 Javascript
JavaScript函数、闭包、原型、面向对象学习笔记
Sep 06 Javascript
原生js实现trigger方法示例代码
May 22 Javascript
微信小程序如何引用外部js,外部样式,公共页面模板
Jul 23 Javascript
Vue的属性、方法、生命周期实例代码详解
Sep 17 Javascript
解决node终端下运行js文件不支持ES6语法
Apr 04 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中 === 的使用
2016/10/24 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
php微信公众号开发之微信企业付款给个人
2018/10/04 PHP
php7 错误处理机制修改实例分析
2020/05/25 PHP
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
JavaScript中getUTCMinutes()方法的使用详解
2015/06/10 Javascript
JavaScript数组对象赋值用法实例
2015/08/04 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
2015/11/16 Javascript
jQuery插件fullPage.js实现全屏滚动效果
2016/12/02 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
2017/06/08 jQuery
基于JavaScript实现飘落星星特效
2017/08/10 Javascript
NodeJs通过async/await处理异步的方法
2017/10/09 NodeJs
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
vue实现点击当前标签高亮效果【推荐】
2018/06/22 Javascript
用Cordova打包Vue项目的方法步骤
2019/02/02 Javascript
Vue代码整洁之去重方法整理
2019/08/06 Javascript
使用layui实现的左侧菜单栏以及动态操作tab项方法
2019/09/10 Javascript
Element的el-tree控件后台数据结构的生成以及方法的抽取
2020/03/05 Javascript
微信小程序实现底部弹出框
2020/11/18 Javascript
[43:49]LGD vs CHAOS 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python opencv旋转图像(保持图像不被裁减)
2018/07/26 Python
Python安装Flask环境及简单应用示例
2019/05/03 Python
pytorch 可视化feature map的示例代码
2019/08/20 Python
Python笔记之工厂模式
2019/11/20 Python
基于python修改srt字幕的时间轴
2020/02/03 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
2020/04/10 Python
将keras的h5模型转换为tensorflow的pb模型操作
2020/05/25 Python
使用 css3 实现圆形进度条的示例
2017/07/05 HTML / CSS
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
PHP面试题大全
2015/10/16 面试题
大学生标准推荐信范文
2013/11/25 职场文书
七匹狼男装广告词
2014/03/21 职场文书
令人印象深刻的自荐信
2014/05/25 职场文书
民主评议党员自我评议范文2014
2014/09/26 职场文书
解决Pytorch dataloader时报错每个tensor维度不一样的问题
2021/05/28 Python
windows系统安装配置nginx环境
2022/06/28 Servers