覆盖抽象方法 TypeScript?

Override abstract method TypeScript?

我有抽象方法:

abstract setProp<T, K extends keyof T>(value: keyof T, key: K);

我试图在 class 继承人中覆盖它:

public setProp<IParentProfile, K extends keyof IParentProfile>(value: keyof IParentProfile, key: K) {
    this.model[key] = value;
  }

但是解释告诉我一个错误:

来自抽象 class 的不兼容覆盖方法,我哪里出错了?

我也这样试过:

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;
  }

你能明白为什么会这样 not work please

正如我在评论中所说,它看起来像是一个编译器错误。 (这只是解决无法覆盖您的通用方法的问题,而不是您稍后在 link 中添加的代码。)

以下是目前 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
}

如果 generic constraints use type parameters,您似乎无法重写泛型方法。

我提交了 Microsoft/TypeScript#25373 并且它(截至 2018-07-02)被归类为一个错误,计划在 TypeScript 3.1 中解决。


在那之前,我猜你需要使用变通办法。实际上,我能找到的唯一可以让您使用类型参数约束覆盖 abstract 泛型方法的解决方法是 sledgehammer of workarounds, the @tsignore comment:

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

希望对您有所帮助;祝你好运!