// @strict: true // @target: es6 // @strictPropertyInitialization: false class C { #foo: T; #method(): T { return this.#foo; } get #prop(): T { return this.#foo; } set #prop(value : T) { this.#foo = value; } bar(x: C) { return x.#foo; } // OK bar2(x: C) { return x.#method(); } // OK bar3(x: C) { return x.#prop; } // OK baz(x: C) { return x.#foo; } // OK baz2(x: C) { return x.#method; } // OK baz3(x: C) { return x.#prop; } // OK quux(x: C) { return x.#foo; } // OK quux2(x: C) { return x.#method; }// OK quux3(x: C) { return x.#prop; } // OK } declare let a: C; declare let b: C; a.#foo; // Error a.#method; // Error a.#prop; // Error a = b; // Error b = a; // Error