TS泛型

179 阅读1分钟

泛型

泛型中的T就像一个占位符,或者说是一个变量,在使用的时候可以把定义的类型向参数一样传入,它可以原封不动的输出 我们在使用的时候可以有两种方式指定类型。

  • 定义要使用的类型
  • TS类型推断,自我推导出类型

image.png

type和interface都可以定义函数类型 ,也用泛型写一下,type这么写

image.png interface这么写

image.png

defineProperty的如何实现数据代理

Object.defineProperty()

1. 基本使用

语法:Object.defineProperty(obj, key, descriptor:属性和方法)

obj:要进行操作的对象。

key:要定义或修改的属性的名称

        Object.defineProperty(obj, 'a', {
            configurable: true,   //是否允许删除
            enumerable: true,    //是否允许枚举
            value: undefined,   //就是value值
            writable: true,      //是否允许赋值   

            get() { },  //获取的return的值
            set(val) { }    //修改的时候执行  val就是最新的值
        })

使用

        name: "张三",
        age: 21
    }

    let keys = Object.keys(obj);
    for (let i in keys) {
        let key = keys[i];
        Object.defineProperty(obj, key, {
            get() {
                return obj[key];
            },
            set(val) {
                obj[key] = val;
            }
        })
    }

    obj.name = "李四";

我们需要设置一个中转data,来让set修改data的值,get在返回出data的属性值。

而不是直接修改obj导致导致递归调用,不然的话会导致栈溢出

        name: "张三",
        age: 21
    }
    let data = {}

    let keys = Object.keys(obj);
    for (let i in keys) {
        let key = keys[i];
        Object.defineProperty(obj,key,{
            get() {
                return data[key];
            },
            set(val) {
                data[key] = val;
            }
        })
    }

    obj.name = "李四"