我有抽象方法:
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
答案 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
}
,因为它所做的只是抑制错误输出。它并不能神奇地解决任何问题。但是,假设编译器错误在不久的将来得到修复,那是一个合理的临时修复程序。
希望有所帮助;祝你好运!