【问题标题】:Decorated class type装饰类
【发布时间】:2018-07-27 07:05:00
【问题描述】:

一个类被修饰为具有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);

这会导致错误:

类型“typeof Bar”不可分配给类型“IFoo”。

TypeScript 打字系统似乎忽略了 Bar 被修饰的事实。

我知道装饰器存在某些类型问题。这里有什么解决方法?

【问题讨论】:

  • TypeScript 是结构化类型的,这意味着如果将静态属性 foo 添加到 Bar 它可以分配给 IFoo 类型的变量,不需要装饰器。
  • 没错。我们的想法是不这样做,而是使用装饰器(IFoo 可能比单个属性更复杂)。

标签: typescript


【解决方案1】:

Typescript 不允许装饰器修改被装饰类的结构。但是,您可以使用一个函数来获取该类并对其进行修改:

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);

【讨论】:

猜你喜欢
  • 2014-01-14
  • 2020-01-11
  • 1970-01-01
  • 2017-04-16
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 2019-09-01
相关资源
最近更新 更多