Microsoft/TypeScript

Intersection with a mapped type breaks bypassing private assignability.

Open

#61,743 opened on May 21, 2025

View on GitHub
 (0 comments) (0 reactions) (0 assignees)TypeScript (48,455 stars) (6,726 forks)batch import
Domain: IntersectionHelp WantedPossible Improvement

Description

🔎 Search Terms

private assignability intersection mapped type

🕗 Version & Regression Information

Latest as of today.

⏯ Playground Link

https://www.typescriptlang.org/play/?#code/CYUwxgNghgTiAEkoGdnwBrwN4CgCQADjAJYBuUALglAFzwB2ArgLYBGIMA3Pq3chSXoBzbgF8cOCgE8CCAJrwAvNni0GLdjHij4AMhW94-QUO3dps+AC0l8AArEwAawA8WVXSZsO2gDTwAcigAgD49Az4BYmEzCVAkOHgIEAp4AA86dG546ETk1Kk6OWzwXIR8+AAvOituHDTbKVU0BX0s+ttK5utw9qA

💻 Code

Given

declare class X {
	private a: number;
	b: string;
}

You're allowed to do:

type Y = { a: number } & { b: string };
declare let y: Y;
let x: X = y as Y & X;

But fails with:

type Z = Pick<{ a: number }, 'a'> & { b: string };
declare let z: Z;
let x: X = z as Z & X;

🙁 Actual behavior

X bypasses private assignability, but the identical type Y errors.

🙂 Expected behavior

Either neither type is allowed to bypass private assignability, or both types are, since they're identical.

Additional information about the issue

No response

Contributor guide