Wrong assignability of class types from expressions with private fields
dragomirtitian opened this issue ยท 3 comments
dragomirtitian commented
๐ Search Terms
class expression private fields assignability
๐ Version & Regression Information
- This is the behavior in every version I tried
โฏ Playground Link
๐ป Code
function makeClass(v: number) {
return class C{
#id = v;
static getId(o: C) {
return o.#id;
}
}
}
const cls1 = makeClass(1)
const cls2 = makeClass(2)
let c1 = new cls2(); // TS thinks this is ok
cls1.getId(c1) // runtime error different versions of #id๐ Actual behavior
c2 is assignable to c1 even though they contain private fields that are different (even if they come from the same source code)
๐ Expected behavior
Instances of cls2 should not be assignable to cls1 since they have different versions of the private field.
Additional information about the issue
Found as I was exploring the consequences of #56145
fatcerberus commented
I'm thinking this is probably a design limitation (i.e. nominally-typed properties are distinguished by source location or something), but yeah, ouch, that's unfortunate.
RyanCavanaugh commented
Yeah, there is zero concept of the kind of per-invocation tracking you'd need to handle this.