microsoft / microsoft/TypeScript

Instantiations of constrained generic signatures allow all assignments

Aperta
#55,671 1 commento 0 reazioni 1 assegnatario Vedi su GitHub

@weswigham ci sta già lavorando.

Dal 7/9/2023.

Bug Domain: check: Variance Relationships
Lingua principale
Go
Stelle
111k
Fork
14.3k
Merge medio
1g 19h
PR unite (30g)
117

Descrizione

🔎 Search Terms

variance generic signature measurement

🕗 Version & Regression Information

This has been our behavior forever as far as I can tell - in fact, I've seen this pattern used once or twice to work around other bugs, even though the behavior is in no way safe.

⏯ Playground Link

https://www.typescriptlang.org/play?#code/C4TwDgpgBAYgdgHgCoD4oF4oIKpQgD2AjgBMBnKVACnwC4psBKDNbAbgCgPRIoBhAPZwAxgCcIRAIwYsuAkVIU4AVwC2AIwiiUNekxYNOPaIJHiiAJhk48hYuShlgogJZwA5jroNm6Vpw4AM2URYBchKEDkSQAaSgsdYEl6eGiUOOALFMQkBLjhZP4hMQkIWKhhLKKzUotmAG8OKGaoAHpWvAA3LRBHN3cAG2ghYcCoYAALCDJoAEMyMhd3OFViYAoyCYFlAZI8UVEBUS4W8elMTLY2js3t3f3D0Tj1ZWAoEgFpuAByYCaWzIyJJXdqOLY7PZaR7PV7vT5kH5-f7NAoySqcU6VNGSAKnJLYjEtVEXHEcAC+QA

💻 Code
type Fn<T> = <U extends T>(x: U) => U;

type Concrete1 = <U extends number>(x: U) => U;
type Concrete2 = <U extends string>(x: U) => U;

function f<T1, T2>(t1: Fn<T1>, t2: Fn<T2>, c1: Concrete1, c2: Concrete2) {
    // every single one of these assignments should error

    t1 = t2; // should error, but doesn't
    t2 = t1; // should error, but doesn't

    c1 = c2;
    c2 = c1;

    t1 = c1;
    c1 = t1;
}
🙁 Actual behavior

Missing two errors on the generic relationships.

🙂 Expected behavior

All of the assignments are errors, as the generic relationship should be even stricter than the non-generic one.

Additional information about the issue

The issue lies in our variance analysis - we currently incorrectly measure T as independent, which is quite different from the invariant it should adopt (via U's invariant usages). This discrepancy arises because of some oddities in how we do generic signature relationships.

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.