我无法理解为什么在这种情况下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
答案 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;
}
我能想到的一些原因:
PS:如果您使用的是'reflect-metadata'软件包,则可以使用console.log(Reflect.getMetadata('design:paramtypes', reflected));
进一步查看
我还没有看到任何副作用,如果发现有任何副作用,将会更新。