简单聊聊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 文本框水印/占位符(watermark/placeholder)实现方法
Jan 15 Javascript
jquery 清空file域示例(兼容个浏览器)
Oct 11 Javascript
JavaScript Array对象扩展indexOf()方法
May 09 Javascript
JS自定义对象实现Java中Map对象功能的方法
Jan 20 Javascript
JS中使用apply方法通过不同数量的参数调用函数的方法
May 31 Javascript
浅谈JavaScript的内置对象和浏览器对象
Jun 03 Javascript
JavaScript requestAnimationFrame动画详解
Sep 14 Javascript
不使用 JS 匿名函数理由
Nov 17 Javascript
解决VUE中document.body.scrollTop为0的问题
Sep 15 Javascript
React和Vue中监听变量变化的方法
Nov 14 Javascript
使用Vue.set()方法实现响应式修改数组数据步骤
Nov 09 Javascript
通过GASP让vue实现动态效果实例代码详解
Nov 24 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
在IIS上安装PHP4.0正式版
2006/10/09 PHP
深入PHP empty(),isset(),is_null()的实例测试详解
2013/06/06 PHP
PHP如何实现Unicode和Utf-8编码相互转换
2015/07/29 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
PHP笛卡尔积实现算法示例
2018/07/30 PHP
php利用ZipArchive类操作文件的实例
2020/01/21 PHP
jQuery 下拉列表 二级联动插件分享
2012/03/29 Javascript
javascript拖拽效果延伸学习
2016/04/04 Javascript
修改jquery中dialog的title属性方法(推荐)
2016/08/26 Javascript
jQuery图片切换动画特效
2016/11/02 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
jquery Ajax实现Select动态添加数据
2017/06/08 jQuery
微信小程序获取微信运动步数的实例代码
2017/07/20 Javascript
Vue.js中的图片引用路径的方式
2017/07/28 Javascript
JS实现图片居中悬浮效果
2017/12/25 Javascript
vue基于element的区间选择组件
2018/09/07 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
[52:57]2014 DOTA2国际邀请赛中国区预选赛 LGD-CDEC VS HGT
2014/05/21 DOTA
python实现linux服务器批量修改密码并生成execl
2014/04/22 Python
轻松实现TensorFlow微信跳一跳的AI
2018/01/05 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
Python类和对象的定义与实际应用案例分析
2018/12/27 Python
Python 多线程共享变量的实现示例
2020/04/17 Python
浅析Python迭代器的高级用法
2020/07/16 Python
python ssh 执行shell命令的示例
2020/09/29 Python
html5 localStorage本地存储_动力节点Java学院整理
2017/07/06 HTML / CSS
详解html5 canvas常用api总结(二)--绘图API
2016/12/14 HTML / CSS
天游软件面试
2013/11/23 面试题
即兴演讲稿
2014/01/04 职场文书
二年级语文教学反思
2014/02/02 职场文书
酒店秘书求职信范文
2014/02/17 职场文书
政府法律服务方案
2014/06/14 职场文书
机关工会工作总结2015
2015/05/26 职场文书
小学信息技术教学反思
2016/02/16 职场文书