const和readonly在引用类型上的一个小坑

const和redaonly这两个大家应该都熟悉,当它们修饰的是非引用类型的数据时,表现很正常。

const a = 1;

interface ReadOnlyObject {
  readonly a:number;
}

const obj:ReadOnlyObject = {
  a:1,
};

a = 2;
obj.a = 2;

很显然,上面最后两句赋值语句都会报错。可如果我们把它们修饰的对象换成引用类型:

const a:number[] = [1];

interface ReadOnlyObject {
  readonly a:number[];
}

const obj:ReadOnlyObject = {
  a: [1],
};

a.push(2);
obj.a.push(2);

这次我们往const和readonly修饰的两个数组push新值,结果执行成功。
因为这两个修饰符号在修饰引用类型的数据时,只是限制不能修改引用,没有限制修改引用所指向的数据。即你一开始指向了数组a就不能它改成指向另一个数组b,而数组a里面的数据可以随便你改。这就导致了,有些同学想用单独用这两个修饰符号定义一个不可被修改的数组或对象常量,缺因为绕过ts检查而误修改。

解决办法

解决办法其实也很简单,数组里的项加上readonly修饰符号就可以了。

const a:readonly number[] = [1];

interface ReadOnlyObject {
  // 这里,对象内这个数组的interface不这么写的话会报错,当然如果你要其他可行的写法,欢迎在评论区留言给我
  readonly a:readonly [number];
}

const obj:ReadOnlyObject = {
  a:[1],
};

a.push(2);  // 报错
obj.a.push(2);  // 报错

这样数组就不允许加减项了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,137评论 1 32
  • 基本内置类型 算术类型字符整型布尔值浮点数 空类型(void) 算术类型 带符号类型和无符号类型int、short...
    2625K阅读 3,270评论 0 1
  • 307、setValue:forKey和setObject:forKey的区别是什么? 答:1, setObjec...
    AlanGe阅读 1,578评论 0 1
  • 1.设计模式是什么? 你知道哪些设计模式,并简要叙述?设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型...
    龍飝阅读 2,187评论 0 12
  • 意识还在梦中的时候,隐隐约约传来了母亲的声音。没有开灯,自从我说开灯会吵醒我之后,就没有开灯过了。她一直在对父...
    仙人掌柜阅读 589评论 3 14