如何避免在TypeScript中的子类中重写函数?

时间:2018-02-27 05:29:56

标签: typescript

根据下面给出的示例,我不希望B类或任何其他扩展A的类能够覆盖funcA

可以在TypeScript中完成吗?如果是,那么,怎么样?

export class A {
    protected funcA(){

    }
}

export class B extends A {
    //Not able to override funcA()

}

3 个答案:

答案 0 :(得分:1)

无法阻止公共/受保护成员覆盖。如果您只使用私有成员,编译器将触发错误。已提出feature,但未实施

答案 1 :(得分:0)

根据此答案:github issue

问题:为方法添加“虚拟”和“替代”关键字

这将是一个重大变化,因为默认情况下方法是“虚拟的”。

甚至还不清楚非虚拟方法在JavaScript中的含义-没有非虚拟调用之类的东西。

答案 2 :(得分:0)

在Javascript中,简短的答案是“是的,我们可以”。我没有使用Typescript的经验,但是我知道它是Javascript的超集,所以我想这意味着如果您可以使用Javascript进行操作,那么可以使用Typescript-如果我错了,请纠正我。

nodejs中以交互式控制台模式运行:

class A {
    constructor(){
        Reflect.defineProperty(this, 'protectedFn', {
            value: ()=>{ return "hello" },
            configurable: false, 
            writable: false,
            enumerable: true
        })
    }
}
class B extends A {
    constructor(){
        super()
        this.protectedFn=()=>{}
    }
}
class C extends A {
    constructor(){
        super()
        Reflect.defineProperty(this, 'protectedFn', {
            value: (v)=>{ return "goodbye" }
        })
    }
}
class D extends A {
    constructor(){
        super()
        Reflect.deleteProperty(this, 'protectedFn')
    }
}
let a = new A();
let b = new B();
let c = new C();
let d = new D();
a.protectedFn()

c.protectedFn()

d.protectedFn()

结果

> let a = new A();

> let b = new B();
Thrown:
TypeError: Cannot assign to read only property 'protectedFn' of object '#<B>'
    at new B (repl:4:19)

> let c = new C();

> let d = new D();

> a.protectedFn()
'hello'

> c.protectedFn()
'hello'

> d.protectedFn()
'hello'

我们看到B的构造函数使用简单的赋值形式调用了throw

C的构造函数没有抛出,但是它默默地失败了。哎哟。 Replace.defineProperty的返回结果实际上是错误的,应进行检查。

D相同。

有趣的是,使用ES5 Object.*代替ES6 Replace.*会在失败时导致throw。另外Object.deleteProperty不存在。