装饰类型

时间:2018-02-16 11:17:50

标签: typescript

一个类被装饰为具有foo静态属性:

interface IFoo {
    foo: boolean;
}

function foo<T>() {
    return (Class: T): T & IFoo => Object.assign(Class, { foo: true });
}

@foo<typeof Bar>()
class Bar { }

const Baz: IFoo = Bar;
console.log(Baz.foo);

这会导致错误:

  

键入&#39; typeof Bar&#39;不能分配类型&#39; IFoo&#39;。

TypeScript输入系统似乎忽略了Bar被装饰的事实。

我意识到装饰器存在某些类型问题。这里的解决方法是什么?

1 个答案:

答案 0 :(得分:2)

Typescript不允许装饰器修改装饰类的结构。然而,您可以使用函数taht获取类并修改它:

interface IFoo {
    foo: boolean;
}

function foo<T extends  new (...  args: any[]) => any>(cls:T) : T & IFoo {
    return Object.assign(cls, { foo: true });
}


const Bar =foo(class  { })

console.log(Bar.foo);