Typescript 可以在装饰器中创建接口吗?

Typescript 可以在装饰器中创建接口吗?,typescript,Typescript,我有一些模型对象,它们有一个与之相关联的模式(模式中的一些信息不能很好地映射到typescript类型,如未设置的默认值和权限数据) 因此,模式如下所示: const PersonSchema: ModelSchema { attributes: { name: 'string', default: '' }, // etc storeData: { sql: { indexColumn: 'uid' } } authorizers: { update: /* snip */} }

我有一些模型对象,它们有一个与之相关联的模式(模式中的一些信息不能很好地映射到typescript类型,如未设置的默认值和权限数据)

因此,模式如下所示:

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 {
}