Typescript 可以在装饰器中创建接口吗?
我有一些模型对象,它们有一个与之相关联的模式(模式中的一些信息不能很好地映射到typescript类型,如未设置的默认值和权限数据) 因此,模式如下所示:Typescript 可以在装饰器中创建接口吗?,typescript,Typescript,我有一些模型对象,它们有一个与之相关联的模式(模式中的一些信息不能很好地映射到typescript类型,如未设置的默认值和权限数据) 因此,模式如下所示: const PersonSchema: ModelSchema { attributes: { name: 'string', default: '' }, // etc storeData: { sql: { indexColumn: 'uid' } } authorizers: { update: /* snip */} }
const PersonSchema: ModelSchema {
attributes: { name: 'string', default: '' }, // etc
storeData: { sql: { indexColumn: 'uid' } }
authorizers: { update: /* snip */}
}
请注意,这里的类型是类型名字符串,因为这是在运行时使用的(我还没有弄清楚如何正确使用反射元数据),以确保正确地序列化和反序列化数据
当你有一个人
并得到它的属性时,你就得到了
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> {}
这将使我不必定义PersonData接口,也不必定义get的返回子类型
我很确定这是不可能的,尽管我可以让返回类型从上下文类型而不是命名接口推断出来。至少有3个库能够从模式描述推断接口类型:,和(免责声明:最后一个是我的)。但是,我认为在您的示例中没有任何东西可以接受“开箱即用”的
属性格式。至少有3个库能够从模式描述推断接口类型:,和(免责声明:最后一个库是我的)。然而,我认为在您的示例中,没有任何东西可以接受“开箱即用”的属性格式。
@Schema(PersonSchema) class Person extends Model {
}