microsoft/TypeScript

Wrong assignability of class types from expressions with private fields

dragomirtitian opened this issue ยท 3 comments

๐Ÿ”Ž Search Terms

class expression private fields assignability

๐Ÿ•— Version & Regression Information

  • This is the behavior in every version I tried

โฏ Playground Link

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

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.

Yeah, there is zero concept of the kind of per-invocation tracking you'd need to handle this.

jcalz commented

Reminds me of #37469, where each invocation of a function spits out a new nominal type.