簡體   English   中英

帶有私有變量的TypeScript類聲明錯誤

[英]TypeScript class declaration error with private variable

如果我有這樣的TypeScript類聲明:

export class myClass {
  constructor(public aVariable: number) {}
  private aPrivateVariable: number;
}

然后嘗試使用以下方法初始化它:

let someVar: myClass[] = [{
  aVariable: 3
}, {
  aVariable: 2
}];

我收到一個錯誤(至少在VS Code中),說:

類型'{avariable:number;類型中缺少屬性'aPrivateVariable' }”。

我為什么不能這樣做?

謝謝。

想象一下,您的類也有使用此字段的方法:

 export class myClass {
  constructor(public aVariable: number) {}
  private aPrivateVariable: number;
  test(){  }
 }

現在,如果您要執行以下操作:

 const instance: myClass = {
    aVariable: 1,
    test() {
      alert.aPrivateVariable + 1);
    }
 };

 instance.test();

它會失敗。 因此,您還需要添加私有屬性。

 let someVar: myClass[] = [{
  aVariable: 3,
  aPrivateVariable: 2,
 }, {
  aVariable: 2,
  aPrivateVariable: 3
 }];

輸入{ aVariable: number; } { aVariable: number; }myClass不兼容

手冊所述,

類中的私有成員和受保護成員會影響其兼容性。 當檢查一個類的實例的兼容性時,如果目標類型包含一個私有成員,那么源類型還必須包含一個源自同一類的私有成員。 同樣,對於具有受保護成員的實例也是如此。 這樣一來,一個類就可以與其父類兼容,但不能與其他繼承層次結構相同的類的繼承兼容。

如果應該將myClass 用作分配與myClass類在結構上兼容的普通對象的接口,則應提供單獨的接口:

interface IMyClass {
  aVariable: number;
}

export class myClass implements IMyClass {...}

let someVar: IMyClass[] = [{
  aVariable: 3
}];

然后嘗試初始化它

應該注意的是,上面的代碼並未初始化該類。 目前尚不清楚分配普通對象而不是類實例的原因是什么,但是如果someVar應該包含myClass實例,則類型錯誤指示問題。 實例應使用new顯式實例化:

let someVar: myClass[] = [new myClass(3)];

以您的方式定義對象( { aVariable: 2} )不會將它們實例化為myClass對象。 這是一個問題,因為未實例化aPrivateVariable因為從不調用myClass構造函數,並且您添加的對象與myClass包含的內容不匹配。

正如摘錄自打字機手冊中關於類型兼容性的陳述

類中的私有成員和受保護成員會影響其兼容性。 當檢查一個類的實例的兼容性時,如果目標類型包含一個私有成員,那么源類型還必須包含一個源自同一類的私有成員。 同樣,對於具有受保護成員的實例也是如此。 這樣一來,一個類就可以與其父類兼容,但不能與其他繼承層次結構相同的類的繼承兼容。

一種解決方法是使用諸如map()類的方法實例化每個對象。

const someVar: myClass[] = [2,3,1].map(num => myClass(num)) ;

或者,如果您對對象的形狀有信心,則可以使用強制類型:

let someVar: myClass[] = [] as myClass[]

但是請謹慎使用此方法,因為它不能保證數組中包含的內容與類的模型匹配。

export class myClass {
   constructor(public aVariable: number) {}
   private aPrivateVariable: number;
}

正確的方法是像這樣真正初始化您的類:

const someVar: myClass[] = [
    new myClass(3),
    new myClass(2),
]

如果不初始化類,那么您想從myClass獲取任何方法,最終將對象轉換為myClass

您忘了宣布課了。 你可以這樣

const someVar: myClass[] = [new myClass(3), new myClass(2)];

初始化此類的正確方法是-

export class myClass {
  constructor(public aVariable: number) {}
  private aPrivateVariable: number;
}

let someVar: myClass = new myClass(3);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM