防止编译部分Typescript代码

防止编译部分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

我有类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 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);