首页 > 解决方案 > 在赋值时访问对象属性键

问题描述

class Item {
    prop:Field;

    constructor() {
        this.prop = this.createField("prop", defaultValue);
    }
}

有没有办法在分配时派生属性键(在cerateField方法中)。我想省略"prop"参数(数据库字段名称需要它)。

标签: typescript

解决方案


我建议使用装饰器。不幸的是,装饰器不能转换属性的类型,因此替代方法是将装饰器与类型转换函数结合使用,我field用小写的“f”命名。该函数本质上只是一个强制类型的空函数,因为装饰器无法做到。装饰器使用带有 setter 和 getterField的函数进行实际值转换。createField

function Field(target: any, propKey: string) {
    Object.defineProperty(target, propKey, {
        configurable: true,
        set(value: any) {
            Object.defineProperty(this, propKey, {
                enumerable: true,
                value: createField(propKey, value)
            })
        }
    })
}

function field<T>(defaultValue: T) {
    return defaultValue as unknown as Field<T>
}

class Item {
    @Field
    prop = field(defaultValue)
}

// This could also be shortened to

class Item {
    @F prop = field(...)
}

推荐阅读