【问题标题】:Access the getter and setter of a typescript property访问 typescript 属性的 getter 和 setter
【发布时间】:2015-03-06 16:47:15
【问题描述】:

我有一个关于 typescript 属性的问题:是否可以获取 typescript 属性的 setter 和 getter 或将函数参数声明为 X 类型的属性?

原因是为了获得对变量的某种“引用”,这在普通 JS 中是不可能的,除非编写 getter/setter 包装器或通过父对象本身(obj[“varname”])访问变量。

例如(一些工作代码和其他部分推测):

//A sample class with a property
class DataClass<T> {
    private T val;

    public get value(): T {
        return this.val;
    }

    public set value(value: T) {
        this.val = value;
    }
}

//Different ways of modifing a member "by reference"
class ModifyRef {
    public static void DoSomethingByGetterAndSetter(getter: () => string, setter: (val: string) => void) {
        var oldValue = getter();
        setter("new value by DoSomethingByGetterAndSetter");
    }

    public static void DoSomethingByObject(obj: Object, name: string) {
        var oldValue = obj[name];
        obj[name] = "new value by DoSomethingByObject";
    }

    //Is something like this possible?
    public static void DoSomethingByProperty(somePropery: property<string>) {
        var oldVlaue = someProperty;
        someProperty = "new value by DoSomethingByProperty";
    }
}

var inst = new DataClass<string>();

//Calling the DoSomethingByProperty if possible
ModifyRef.DoSomethingByProperty(inst.value);

//Or if not is something like this possible
ModifyRef.DoSomethingByGetterAndSetter(inst.value.get, inst.value.set);

【问题讨论】:

    标签: properties typescript


    【解决方案1】:

    最简单的方法是提供方法,而不是属性:

    //A sample class with a property
    class DataClass<T> {
        private val: T;
    
        public getValue(): T {
            return this.val;
        }
    
        public setValue(value: T) {
            this.val = value;
        }
    }
    
    class ModifyRef {
        public static DoSomethingByGetterAndSetter(getter: () => string, setter: (val: string) => void) {
            var oldValue = getter();
            setter("new value by DoSomethingByGetterAndSetter");
        }
    }
    
    var inst = new DataClass<string>();
    
    //Or if not is something like this possible
    ModifyRef.DoSomethingByGetterAndSetter(inst.getValue, inst.setValue);
    

    【讨论】:

      【解决方案2】:

      我一直很惊讶,带有属性的语言不包含引用属性的便捷方式,have daydreamed about having this feature in C#。它也应该适用于局部变量。

      这种一等或reified属性的流行模式是可以通过两种方式调用的单个函数:

      1. 无参数:返回当前值。
      2. 一个参数:设置值,返回undefined

      或者用 TypeScript 术语:

      interface Property<T> {
          (): T;
          (newVal: T): void;
      }
      

      jQuery 对象的方法通常是这样工作的。 Knockout 是纯数据建模模式的一个示例,其中此类属性也支持更改订阅,并且有一个相当优雅的模式用于定义计算属性,当它们的依赖关系发生变化时会自动重新计算。

      【讨论】:

        猜你喜欢
        • 2018-11-25
        • 1970-01-01
        • 2017-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多