在TS中如何动态增加类的属性成员

在TS中如何动态增加类的属性成员

一、前言

最近的工作中接触到一个TS的项目,复杂的封装架构,据说架构着是java出身的,于是项目中出现了数据模型、视图模型等,还有诸多的业务模型。我需要去写模型调用数据,由于之前同事的逻辑中对接口返回数据又进行了封装,现在要求用新的接口定义返回数据模型,这就导致写代码过程中,我用的很多属性在原来定义的模型中没有,TS检查不通过,出现了大量错误。通过TS中的索引器可以解决这个问题

二、什么是索引器

索引器并不陌生,JS中叫做成员表达式对象[值],在TS中,默认情况下,不对索引器做严格的类型检查,在索引器中,键的类型可以是字符串数字,在类中,索引器书写的位置应该在所有成员之前。

三、代码演示

先写一个对字符串类型的

class User {
    [prop:string]:any  // prop名字可以随便起
    constructor(
        public name:string,
        public age:number    
    ){}
    sayHello(){}
}
const u = new User("aa",22);
u.pid = "223"; // 这样也是成立的,虽然类中没有,但符合索引器规则不报错,因此可以用索引器随意添加属性

再来看一个数字类型的

class MyArray {
    [index:number]:string
    0 = "1" // 这在ts里是成立的,会被编译成在构造函数constructor中的this[0] = 1
    1 = "abc"
    2 = "def"
}
const my = new MyArray();
my[5] = "2"

四、总结

TS中索引器的作用
1、在严格的检查下、可以实现为类动态增加成员
2、可以实现动态的操作类成员
3、在js中,所有的成员名本质上,都是字符串,如果使用数字作为成员名,会自动转换为字符串,在TS中,如果某个类使用了两种类型的索引器,要求两种索引器的值类型必须匹配。
关于业务的总结
对于已经定义的数据返回模型dataType,字段都是确定的。假设data是这个类型的,但我想增加一个是否被选择的字段data.isSelected = true,此时TS就会说dataType不存在属性isSelected,加上索引器就可以了。虽然可以解决这个问题,但这可能并不好,一定程度上打破了TS的类型控制。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值