[英]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.