为什么私人成员可以通过方括号表示法访问?

时间:2016-09-06 10:16:57

标签: typescript

考虑以下小片段:

class BlueprintNode {
    private metadata: number[] = [];
}

var node = new BlueprintNode();
node["metadata"].push("Access violation, rangers lead the way.");

Demo on TypeScript Playground

为什么TypeScript编译器允许通过使用方括号表示法来访问私有成员?它甚至可以正确检测给定属性的类型。使用点表示法,它会正确显示编译错误。

2 个答案:

答案 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;
    }
}