我正在尝试使用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做到这一点?