防止部分Typescript代码被编译

时间:2016-06-07 06:16:43

标签: typescript

我有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中编译此方法?我想在方法之前可以做一些评论。

1 个答案:

答案 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> {}

code in playground

此方法添加了另一个类(Base),它实际上具有setProperty的实现,并且只发生一次,而在AB中,您只需声明类型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);

code in playground