首页 > 解决方案 > 为私有属性创建通用设置器

问题描述

我有一个具有许多私有属性的类,这些私有属性具有各种类型,我想为其创建一个通用的公共 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>)联合的正确依赖类型:PropTypeA

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 方法。我也知道我可以创建一个将使用与此类似的技巧。我不是在问这个。我知道有很多解决方法。

标签: typescript

解决方案


推荐阅读