我正在嘗試學習 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;
...
}
問題是我收到錯誤“Class 'MyClass' 錯誤地擴展了基類 'MyAbstractClass'。型別具有私有屬性 'param' 的單獨宣告。”
我不明白為什么會出現此錯誤,因為 AParamType 型別正確擴展了 MyParamBaseType
有人可以幫助我嗎?謝謝你的幫助。
uj5u.com熱心網友回復:
該private關鍵字只是一個編譯期進行檢查。這意味著該欄位param將在運行時存盤在類的實體中。MyAbstractClass 宣告它是私有成員,因此如果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;
}
游樂場鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/378781.html
標籤:javascript 有角的 打字稿
上一篇:如何簡化包含“作業時間”的物件?
