具有Flow的动态对象字段

时间:2018-10-23 16:27:26

标签: javascript flowtype

我正在尝试使用Flow设计一个简单的域类。本质上,域声明是字段的集合。例如,要定义一个简单的用户域,类型和声明为:

type DomainFieldConfigurationType<T> = {
  required: boolean,
  type: string
}

type ExtractFieldType = <T>(T) => DomainFieldConfigurationType<T>

type DomainConfigurationType<T> = {
  fields: $ObjMap<T, ExtractFieldType>
}

type User = {|
  name: string 
|}

const userConfiguration: DomainConfigurationType<User> = {
  fields: {
    name: { required: true, type: "string" } 
  }
}

到目前为止一切都很好。

我想设计一个Domain<T>类,它是由一个简单的函数创建的:

createDomain<T>(config: DomainFieldConfigurationType<T>): Class<Domain<T>>

我可以这样做:

const User: Class<Domain<User>> = createDomain(userConfiguration);
const saraData: User = { name: "sara" };
const sara: Domain<User> = new User(saraData);

从本质上讲,这是一个简单的类似于ORM的模型类。我可以使用Flow验证它,没有问题,而且效果很好。

但是,我试图对生成的域实例的字段启用读取访问权限:

const name = sara.name // Works
const age = sara.age // Error: Property `age` is missing in `Domain`

这些字段已用object.defineProperty注册。我也确实想将这些属性限制为在域配置字段中定义的属性,以便在我们的示例中允许使用sara.name,但不允许使用sara.age

我尝试使用索引器字段,如here所示,但到目前为止没有成功-它不支持点语法,并且我不知道如何限制键。目前有什么方法可以使用Flow做到这一点?

0 个答案:

没有答案