typescript中泛型类型的严格类型问题



我正在努力学习Typescript中的严格打字。

我定义了这些类:

export abstract class MyAbstractClass<TParam extends MyParamBaseType> {
private param: TParam;
setInitParams(init: TParam): void {
...
}
getInitParams(): TParam {
....
}
}
export class MyClass extends MyAbstractClass<AParamType> {
private param: AParamType;
...
}

问题是我得到了错误";类"MyClass"错误地扩展了基类"MyAbstractClass"。类型具有私有属性"param"的单独声明">

我不明白为什么我会得到这个错误,因为AParamType类型正确地扩展了MyParamBaseType

有人能帮我吗?谢谢你的帮助。

private关键字只是一个编译时检查的关键字。这意味着字段param将在运行时存储在类的实例中。MyAbstractClass声明其成员为private,因此如果允许MyClass重新声明param字段,它最终会在运行时访问实例中名为param的同一字段,从而破坏隐私。

您可以使用ES私有类字段(与#一起使用(。即使在运行时,它们也能确保严格的隐私,并且子类中的名称冲突也不是问题,因为即使它们共享相同的名称,每个声明的字段也是不同的:

type MyParamBaseType = {}
export abstract class MyAbstractClass<TParam extends MyParamBaseType> {
#param!: TParam;
setInitParams(init: TParam): void {
}
getInitParams(): TParam {
return this.#param;
}
}
type AParamType = {}
export class MyClass extends MyAbstractClass<AParamType> {
#param!: AParamType;
}

游乐场链接

或者,如果你想从基类访问相同的字段,你可以考虑protected

type MyParamBaseType = {}
export abstract class MyAbstractClass<TParam extends MyParamBaseType> {
protected param!: TParam;
setInitParams(init: TParam): void {
}
getInitParams(): TParam {
return this.param
}
}
type AParamType = {}
export class MyClass extends MyAbstractClass<AParamType> {
protected param!: AParamType;
}

游乐场链接

最新更新