根据下面给出的示例,我不希望B类或任何其他扩展A
的类能够覆盖funcA
。
可以在TypeScript中完成吗?如果是,那么,怎么样?
export class A {
protected funcA(){
}
}
export class B extends A {
//Not able to override funcA()
}
答案 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
不存在。