防止编译部分Typescript代码
我有类A和类B,它们扩展了类A。类A有一个方法,它接受属性枚举作为第一个参数。类B具有相同的方法,该方法接受APProperties或BPProperties枚举作为第一个参数防止编译部分Typescript代码,typescript,Typescript,我有类A和类B,它们扩展了类A。类A有一个方法,它接受属性枚举作为第一个参数。类B具有相同的方法,该方法接受APProperties或BPProperties枚举作为第一个参数 enum AProperties { X, Y } enum BProperties { Z, W } class A { setProperty(property: AProperties, value: number) { } } class B extends
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编辑器知道此方法可以同时接受ApProperties和BProperty。当编译为JavaScript时,在classB中使用setProperty没有任何意义,因为它与classA方法完全相同
有没有办法防止用JavaScript编译此方法?我想在方法可以完成这项工作之前应该先做一些注释。我不认为有办法要求编译器跳过代码而不注释出来,但是您可以稍微改变设计,避免在子类中添加方法的实现:
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
类
编辑 我想到了另一个解决方案,您可能会更喜欢它,因为它不需要其他类(
Base
):
接口基础{
setProperty(属性:T,值:number);
}
类A实现了Base)我认为没有一种方法可以要求编译器跳过代码而不注释掉它,但是您可以设计一些不同的东西,避免在子类中添加方法的实现:
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
类
编辑
我想到了另一个解决方案,您可能会更喜欢它,因为它不需要其他类(Base
):
接口基础{
setProperty(属性:T,值:number);
}
A类实现基本功能)不确定在您的情况下是否可能,但您能否使用接口而不是扩展A
?不确定在您的情况下是否可能,但您能否使用接口而不是扩展A
,如果类B扩展了类A,这应该是什么样子?为此,您需要将泛型添加到A
,这可能不方便(至少在支持默认泛型类型之前)。因此,我建议使用Base
类,在该类中,您持有A
和B
的共享内容,然后只有Base
是泛型的。顺便问一下,如果类B扩展了类A,这应该是什么样子?您需要为A
添加泛型,这可能并不方便(至少在支持默认泛型类型之前是这样)。因此我建议使用Base
类,在该类中,您持有A
和B
的共享内容,然后只有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);