我正在尝试在 Typescript 中实现一个类装饰器。所以我有一个将类作为参数的函数。
const decorate = function ()
{
return function ( target: any )
{
return class myExtendClass extends target{}
};
};
目标是像这样使用它:
@decorate()
class Something{}
不幸的是,我收到type any is not a constructor function type
。知道如何实现我想要的吗?
最佳答案
my question is why this code doesnt work, since its valid js
这取决于您所说的不起作用是什么意思。
生成的 javascript 有效并且可以工作。但是 TypeScript 更严格,如果您编写不符合 TS 规则的代码,它会提示,尽管它通常会很好地运行并为您提供编译后的 js。
您尝试做的问题是 TS 不支持通过装饰器扩展类。它将生成有效的 js,但 TS 不了解您执行此操作时发生的情况。
例如:
const decorate = () => (target: typeof Cat) =>
{
return class Lion extends target
{
public Roar = () => console.log("Roaar")
}
}
@decorate()
class Cat
{
public Purr = () => console.log("Purr purr");
}
var lion = new Cat();
lion.Roar(); // Error in TypeScript but working in js
当你运行它时它会工作,但是 TS 不明白你在装饰器中做什么,所以它不知道类 Cat
实际上是一个 Lion
.
有一个feature request关于让 TS 理解装饰器中的类突变,但目前不支持。
我建议您避免像这样在装饰器中改变类。即使它可行,我也看不到你现在的例子的意义,它不是很直观,如果你希望所有 Something
都具有某些属性,你可以直接扩展它: 扩展了 MyReusableProperties
关于typescript - 类型 'any' 不是构造函数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39941156/