如何确保装饰者';s论点;“目标”;扩展typescript中的接口?

如何确保装饰者';s论点;“目标”;扩展typescript中的接口?,typescript,interface,decorator,Typescript,Interface,Decorator,我正在学习TypeScript2,并且正在玩装饰程序和通用T。 类装饰器是否可以确保其目标扩展特定接口 这样(此代码不起作用): interface IAction{} 功能操作(选项?:任何){ 返回函数(目标:){} } @行动() 导出类CreateTodAction实现IAAction{} 接口操作{ 种类:弦; } 函数操作(选项?:{}){ 返回函数操作>(目标:T){} } @行动() 导出类CreateTodoAction实现操作{ 种类=‘创建’; } 值得注意的是,由于im

我正在学习TypeScript2,并且正在玩装饰程序和通用T。 类装饰器是否可以确保其目标扩展特定接口

这样(此代码不起作用):

interface IAction{}
功能操作(选项?:任何){
返回函数(目标:){}
}
@行动()
导出类CreateTodAction实现IAAction{}
接口操作{
种类:弦;
}
函数操作(选项?:{}){
返回函数操作>(目标:T){}
}
@行动()
导出类CreateTodoAction实现操作{
种类=‘创建’;
}

值得注意的是,由于
implements
子句在TypeScript中是可选的,并且由于decorator强制其目标类创建满足接口的实例,因此没有真正的理由在类定义本身中使用它。只是风格的问题,但感觉很重复。

谢谢Aluan。我尝试了您的代码,并意识到如果CreateTodoAction未实现
接口操作
,typescript不会抛出错误。我的目标是在使用
@Action
装饰器时强制实现操作接口。typescript可以吗?可以。问题是你的界面是空的。如果这是您的意思,那么没有办法要求
implements
子句,因为类型系统是结构化的。这要求实现
接口
的成员,这在结构类型系统中是完全相同的。@David我理解您的目标,这正是它的作用。我的下一步是创建一个方法装饰器,它只接受实现
操作接口
的类<代码>操作上的函数>(操作:T):任何{返回函数(目标、键、描述符){}}适合我的需要,谢谢您的时间;)Mhh,如果我使用
类FalseTodoAction
未实现
操作
并将其传递给方法修饰符上的
@。然后,如果我将
name
属性设置为该
类FalseToAction
,则typescript不会抛出错误。但是如果你不想“仅仅”检查结构,但确实要确保装饰器上的
@的第一个参数是
CreateTodoAction
构造函数?我所理解的是
new(…args:{}[])=>Action
告诉编译器“我想得到一个实现Action结构的对象”。“我想得到一个等于CreateTodoAction构造函数的对象”怎么样?
interface IAction {}

function Action(options?:any) {
    return function(target:<T extends IAction>) {}
}

@Action()
export class CreateTodoAction implements IAction {}
interface Action {
  kind: string;
}

function action(options?: {}) {
    return function<T extends new(...args: {}[]) => Action>(target: T) {}
}

@action()
export class CreateTodoAction implements Action {
  kind = 'create';
}