我有A类和B类,它扩展了A类.A类有一个接受AProperties枚举作为第一个参数的方法。 B类具有相同的方法,它接受AProperties或BProperties枚举作为第一个参数。
enum AProperties {
X,
Y
}
enum BProperties {
Z,
W
}
class A {
setProperty(property: AProperties, value: number) {
}
}
class B extends A {
setProperty(property: AProperties | BProperties, value: number) {
}
}
类B的setProperty方法仅为typescript编辑器添加,以便知道此方法可以接受AProperties和BProperties。当编译为JavaScript时,在classB中使用setProperty没有任何意义,因为它与classA方法完全相同。
有没有办法阻止在JavaScript中编译此方法?我想在方法之前可以做一些评论。
答案 0 :(得分:2)
我不认为有一种方法可以让编译器跳过代码而不对其进行评论,但是你可以设计一些不同的东西并且避免在方法中添加方法的实现。儿童班:
enum AProperties {
X,
Y
}
enum BProperties {
Z,
W
}
class Base<T> {
setProperty(property: T, value: number) {
// ...
}
}
class A extends Base<AProperties> {}
class B extends Base<AProperties | BProperties> {}
此方法添加了另一个类(Base
),它实际上具有setProperty
的实现,并且只发生一次,而在A
和B
中,您只需声明类型property
enum。
有一个discussion/suggestion to have default generic types(当它实施时)会更容易,例如:
class A<T = AProperties> {
setProperty(property: T, value: number) {}
}
class B extends Base<AProperties | BProperties> {}
但是现在你需要Base
课程。
我想到了另一个解决方案,你可能会更喜欢它,因为它不需要另一个类(Base
):
interface Base<T> {
setProperty(property: T, value: number);
}
class A implements Base<AProperties> {
setProperty(property: AProperties, value: number) {
// ...
}
}
class B implements Base<AProperties | BProperties> {
setProperty: (property: AProperties | BProperties, value: number) => void;
}
let a = new A();
a.setProperty(AProperties.X, 4);
let b = new B();
b.setProperty(AProperties.X, 4);
b.setProperty(BProperties.W, 4);