typescript - 类型 'any' 不是构造函数类型

标签 typescript

我正在尝试在 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/

相关文章:

angular - 使用无效数据调用函数 DocumentReference.set()。不支持的字段值 : a custom Budget object

typescript - 为什么partialType 不使属性可以为空?

reactjs - 获取 Ant Design Multi Upload 列表的 Base64 字符串

javascript - Sequelize 查找或创建项目列表

javascript - 现在和每 1 分钟整分钟调用一次函数?

typescript - Angular 2 : Inject external Component into other component via directive not working

javascript - express-validator 两次返回验证错误

angular - 在 CanActivate guard 中获取目标路由 URL Lazy load modules Angular

javascript - 类型 'number[]' 缺少类型 '[number, number, number, number]' 的以下属性 : 0, 1、2、3

typescript - 我如何编写一个将可变或不可变数组作为参数的通用 TypeScript 函数