typescript - 在赋值时访问对象属性键
问题描述
class Item {
prop:Field;
constructor() {
this.prop = this.createField("prop", defaultValue);
}
}
有没有办法在分配时派生属性键(在cerateField
方法中)。我想省略"prop"
参数(数据库字段名称需要它)。
解决方案
我建议使用装饰器。不幸的是,装饰器不能转换属性的类型,因此替代方法是将装饰器与类型转换函数结合使用,我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(...)
}
推荐阅读
- rust - 何时应将“静态绑定”添加到特征定义
- reactjs - 如何最好地使用 ApolloClient / InMemoryCache 并为 API 启用按需缓存?
- r - 3dplot.sty 文件应该保存在 R 的哪个文件夹中?
- r - 您将如何在 Flexdashboard R 中生成多个散点图
- ruby-on-rails - rdebug-ide is exploading 我的 rdebug-ide 咒语错了吗?
- google-cloud-platform - 无法禁用 Compute Engine API
- pytorch - 将张量列表转换为张量 pytorch
- javascript - 如何从 JSON 中获取数据?
- c++ - 是否有用于访问在 std::array 中具有值的元素数量的函数?
- flutter - Flutter Web 跨多个选项卡共享相同的 socketio 连接