>我有抽象方法:
abstract setProp<T, K extends keyof T>(value: keyof T, key: K);
我试图在类继承人中覆盖它:
public setProp<IParentProfile, K extends keyof IParentProfile>(value: keyof IParentProfile, key: K) {
this.model[key] = value;
}
但解释告诉我一个错误:
抽象类的不兼容覆盖方法,我在哪里犯了错误?
我也尝试了这种方式:
abstract setProp<T, K extends keyof T>(model: T, value: keyof T, key: K): T;
并使用:
public setProp<IParentProfile, K extends keyof IParentProfile>(model: IParentProfile, value: keyof IParentProfile, key: K) {
return model[key] = value;
}
你能明白为什么这不起作用吗
正如我在评论中所说,它看起来像一个编译器错误。(这只是解决无法重写泛型方法的问题,而不是您稍后在链接中添加的代码。
以下是 TypeScript 2.9 及更低版本中当前的错误:
class A {
m<T, U extends T>(t: T, u: U) { }
}
class B extends A {
m<T, U extends T>(t: T, u: U) { }
//^--error, T is not assignable to T
}
如果泛型方法的泛型约束使用类型参数,则似乎无法重写泛型方法。
我提交了Microsoft/TypeScript#25373,它(截至2018-07-02(被归类为错误,预计将在TypeScript 3.1中解决。
在那之前,我想你需要使用解决方法。 实际上,我能找到的唯一允许您使用类型参数约束覆盖abstract
泛型方法的解决方法是解决方法的大锤,@tsignore
注释:
class A {
m<T, U extends T>(t: T, u: U) { }
}
class B extends A {
// @ts-ignore
m<T, U extends T>(t: T, u: U) { } // no error
}
我通常不建议使用@ts-ignore
,因为它所做的只是抑制错误输出; 它不会神奇地修复任何东西。 但是假设编译器错误在不久的将来得到修复,这是一个合理的临时修复。
希望有帮助;祝你好运!