覆盖抽象方法TypeScript?

时间:2018-07-02 13:29:54

标签: typescript typescript2.0

我有抽象方法:

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

您能知道为什么这样做not work please

1 个答案:

答案 0 :(得分:2)

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

以下是TypeScript 2.9及以下版本中的错误:

Adapting to protocol v5.1 for kernel 4936679e-2075-41e6-a2f0-e5780fc7a77c
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.apache.hadoop.security.authentication.util.KerberosUtil (file:/anaconda3/lib/python3.6/site-packages/pyspark/jars/hadoop-auth-2.7.3.jar) to method sun.security.krb5.Config.getInstance()
WARNING: Please consider reporting this to the maintainers of org.apache.hadoop.security.authentication.util.KerberosUtil
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
2018-07-02 17:46:34 WARN  NativeCodeLoader:62 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).

似乎通用方法generic constraints use type parameters不能覆盖。

我提交了Microsoft/TypeScript#25373,并且(截至2018年7月2日)已归类为bug,计划在TypeScript 3.1中解决。


在那之前,我想您需要使用解决方法。实际上,我能找到的让您使用类型参数约束覆盖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 } 通用方法的唯一解决方法是sledgehammer的解决方法@tsignore comment

abstract

我通常不建议使用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 } ,因为它所做的只是抑制错误输出。它并不能神奇地解决任何问题。但是,假设编译器错误在不久的将来得到修复,那是一个合理的临时修复程序。

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