覆盖抽象方法 TypeScript?



>我有抽象方法:

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,因为它所做的只是抑制错误输出; 它不会神奇地修复任何东西。 但是假设编译器错误在不久的将来得到修复,这是一个合理的临时修复。

希望有帮助;祝你好运!

相关内容

  • 没有找到相关文章

最新更新