考虑以下小片段:
class BlueprintNode {
private metadata: number[] = [];
}
var node = new BlueprintNode();
node["metadata"].push("Access violation, rangers lead the way.");
为什么TypeScript编译器允许通过使用方括号表示法来访问私有成员?它甚至可以正确检测给定属性的类型。使用点表示法,它会正确显示编译错误。
答案 0 :(得分:2)
使用索引访问对象属性时,编译器会将对象视为:
interface BlueprintNode {
metadata: number[];
[key: string]: any;
}
如果你这样做:
let node: BlueprintNode;
node["metadata"].push("Access violation, rangers lead the way.");
您将收到与您的代码相同的错误。
答案 1 :(得分:0)
为什么 TypeScript 允许使用方括号访问私有方法:
const privateMethodClass: PrivateMethodClass = new PrivateMethodClass();
let result: boolean;
result = privateMethodClass.getFlag(); //result = false
// Accessing private method using square brackets
privateMethodClass[ "setFlag" ]( true );
result = privateMethodClass.getFlag(); //Result = true
class PrivateMethodClass {
private flag: boolean = false;
private setFlag( flag: boolean ): void {
this.flag = flag;
}
public getFlag(): boolean {
return this.flag;
}
}