TypeScript:无法解析泛型类装饰器的签名

时间:2017-07-31 13:59:40

标签: typescript typescript-generics

我无法理解为什么在这种情况下TypeScript需要ID <- c(1, 1, 2, 2, 2, 3) Name <- c('Jim', 'Jim', 'Sally', 'Sally', 'Sally', 'Jim') Value <- c(100,200,300,200,300,500) want <- data.frame(ID, Name, Value) Child2的显式泛型类型定义:

Child3

2 个答案:

答案 0 :(得分:2)

问题是TS无法从唯一参数valueA推断出T的类型。你想要的是内部/返回函数的泛型参数:

// decorator, modifies methods and static properties
function ClassDecorator(valueA: string) {
    return function <T extends BaseType>(value: T): T {
        value.prototype.DoSmthWithClassName = () => value.name + ".DoSmth." + value.A;
        value.A = value.name + valueA;
        return value;
    }
}

您的版本不会导致Child0和Child1出现任何问题,因为它们在结构上与base相同。

答案 1 :(得分:0)

现在回答还为时已晚,我不知道它是否仍能满足需要。但是,无需在ClassDecorator内部使用通用参数,您仍然可以实例化带有“静态X”的Child2,并通过Child2.X访问X。

这是由于以下事实:没有构造函数的ClassDecorator就像没有船的经验丰富的水手,它需要一个Type,以便Typescript可以肯定地将其编译为函数。

最好的解决方案是将其反映在ClassDecorator之后,

const Reflected = (value:string) : ClassDecorator => {
  return reflected => { 
    // `reflected` here is `Type<Foo>`, not `Foo`
    console.log(`The reflected:  ${reflected}`)
  };
};

由于@Reflected(“ Foo”)不是新实例,因此可以立即使用它。

//@ClassDecorator("Foo") // Unable to resolve...
@Reflected("Foo")
class Child2 extends Base {
  public static X: number = 0;
  
}

我能想到的一些原因:

  • 一个类,基本上是运行时的javascript函数,太多了泛型,但没有一个常量实例(专注于类型),这就是为什么我们需要ClassDecorator来实现“依赖注入”和其他好处。 -在Typescript中,我们需要一种“修饰的”实例,而不是在设计时实例本身,并且在编译时它提供正确的类型。

TS Playground

PS:如果您使用的是'reflect-metadata'软件包,则可以使用console.log(Reflect.getMetadata('design:paramtypes', reflected));进一步查看 我还没有看到任何副作用,如果发现有任何副作用,将会更新。