microsoft / microsoft/TypeScript
Class parameter incorrectly treated as bivariant
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.4k
- Avg merge
- 1d 19h
- Merged PRs (30d)
- 117
Description
🔎 Search Terms
class parameter generic bivariant constructor typeof extends
🕗 Version & Regression Information
- This is the behavior in every version I tried
⏯ Playground Link
💻 Code
type AbstractableConstructor<instance = {}> = abstract new (
...args: never[]
) => instance
type InstanceOf<constructor> =
constructor extends AbstractableConstructor<infer instance> ? instance : never
class Foo {
declare bar: true
}
class Proto<proto extends AbstractableConstructor = AbstractableConstructor> {
declare instance: InstanceOf<proto>
}
// Ok
type A = Proto["instance"]
// ^? {}
// Ok
type B = Proto<typeof Foo>["instance"]
// ^? Foo
// Ok
type C = A extends B ? true : false
// ^? false
// This should be false
type Z = Proto extends Proto<typeof Foo> ? true : false
// ^? true
🙁 Actual behavior
proto is treated as bivariant with no structural comparison, resulting in Z evaluating to true.
🙂 Expected behavior
proto should be treated as covariant as only its return type is used, or compared structurally, resulting in Z evaluating to false.
Additional information about the issue
No response
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the supplied TypeScript Playground link and reduce the generic class and conditional-type reproduction while preserving the reported result for Z. Compare the current behavior with the expected structural or covariant comparison, and consider the work complete when the example evaluates Z as false without regressing the A, B, and C results.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100