typescript - 为私有属性创建通用设置器
问题描述
我有一个具有许多私有属性的类,这些私有属性具有各种类型,我想为其创建一个通用的公共 Set 方法。
class A {
private prop1: Array<A> = new Array()
private prop2: Array<[A,A]> = new Array()
}
// Set method that can be used in following way:
// a.Set('prop1', new Array<A>())
// a.Set('prop2', new Array<[A, A]>())
// but not:
// a.Set('prop3', ...)
// a.Set('prop1', 23)
本质上,我想要一个 Set 方法,它具有: 第一个参数限制为A
. 理想情况下是自动枚举,但由于keyof
不处理私有属性,因此手写集很好(例如type AProps = 'prop1'|'prop2'
)。第二个参数限制为第一个参数对应的属性的类型。
即这样的事情(我知道这不起作用),其中选择所有可能的PropType<A, property>)
联合的正确依赖类型:PropType
A
type PropType<TObj, TProp extends keyof TObj> = TObj[TProp];
class A {
private prop1: Array<A> = new Array()
private prop2: Array<[A,A]> = new Array()
public Set(property: keyof A, value: PropType<A, property>) {
this[property] = value
}
我 90% 确定它不能在当前的 TS 类型系统中以合理的类型安全方式完成。
虽然装饰器可能会有所帮助,但由于无法修改目标的类/接口,它(尚未)可用:https ://github.com/microsoft/TypeScript/issues/4881
我知道我可以手动创建 setter 方法。我也知道我可以创建一个将使用与此类似的技巧。我不是在问这个。我知道有很多解决方法。
解决方案
推荐阅读
- sql - 查询以获取 Schema/DB 中具有特定列 VALUE 的所有表
- javascript - 如何在 JavaScript 中编辑组合框的默认值
- css - 许多 CSS 变量对性能的影响
- google-cloud-platform - 使文件夹部分可访问
- npm - 无法使用 sudo 运行 npm 命令
- c# - 跟踪网络内设备的 IP 更改
- pentaho-data-integration - Excel 模板中的 Pentaho 数据
- dialogflow-es - 稍后在您的 Google 操作中如何更改“操作和参数”?
- vue.js - Vue.js 如何在组件中定义(覆盖)css 样式?
- .net - 将 OpenCV Mat 或 Image 转换为 Tensorflow 的 NumPy 数组