Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

I think variance can be simulated by typing the private field as an existing covariant/contravariant/invariant type

  class CovariantFoo<T> {
    private phantom!: T
  }

  class ContravariantFoo<T> {
    private phantom!: (_: T) => void
  }

  class InvariantFoo<T> {
    private phantom!: (_: T) => T
  }
(inspired by Rust [0])

[0] https://doc.rust-lang.org/nomicon/phantom-data.html



I believe this is conceptually similar to how "brands" can operate to add HKTs to TypeScript/Flow

https://www.cl.cam.ac.uk/~jdy22/papers/lightweight-higher-ki...

https://cs.emis.de/LIPIcs/volltexte/2015/5231/pdf/21_.pdf


But variance depends on position where the value is used, not at the time of declaration, superclass/subclass at parameter/return value position can't be correctly encoded like this, can it?


I think most languages define variance at type definition level, notable exceptions being Kotlin which supports both [0][1] and Flow. But yeah, TS doesn't support (variable-)declaration-site variance which I didn't realize you were asking in my previous answer.

[0] https://kotlinlang.org/docs/generics.html#variance

[1] https://kotlinlang.org/docs/generics.html#declaration-site-v...


Doesn't OCaml support it as well?


I'm less familiar with OCaml and don't know off the top of my head. Doing a quick search I was only able to find references to type declaration variance [0], though I learned that Java also supports use-site variance too [1]

[0] https://blog.janestreet.com/a-and-a/

[1] https://blog.jooq.org/tag/use-site-variance/




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: