我有一些Model对象,它们有一个与之关联的模式(模式有一些信息不能很好地映射到typescript类型,如默认值,如果未设置和权限数据)。
所以架构如下:
const PersonSchema: ModelSchema {
attributes: { name: 'string', default: '' }, // etc
storeData: { sql: { indexColumn: 'uid' } }
authorizers: { update: /* snip */}
}
请注意,这里的类型是字符串,它们是类型名,因为它在运行时使用(我还没有弄清楚如何正确使用反射元数据)来做一些事情,比如确保你对数据进行serlializing和反序列化正常。
当你实际拥有Person
并获得其属性时,你已经
interface PersonData {
id: number | string; // some data stores use string uids, some don't
attributes: { name: string }
}
所以我可以得到像{ id: 42, attributes: { name: 'Arthur Dent' } }
这样的东西,PersonData
接口意味着我正在访问属性等等。
自然地,完全定义数据模型的模式与定义从Model.get()
获得的内容的接口之间存在强烈的相关性。 PersonData接口可以从PersonSchema中推断出来。
现在,我这样做
class Model<U extends ModelData> {
get(): Promise<U>
}
class Person extends Model<PersonData> {}
我想要做的是定义一个可以附加到Model类的装饰器,如下所示:
@Schema(PersonSchema) class Person extends Model {
}
这将使我能够不必定义PersonData接口,而不必定义get的返回子类型。
我很确定这是不可能的,虽然我可以将返回类型设置为某种从上下文推断的类型而不是命名接口。