Microsoft/TypeScript
GitHub ã§èŠãClass parameter incorrectly treated as bivariant
Open
#56,225 opened on 2023幎10æ26æ¥
BugDomain: check: Variance RelationshipsHelp Wanted
Repository metrics
- Stars
- Â (48,455 stars)
- PR merge metrics
-  (å¹³åããŒãž 6d 17h) (30d ã§ 9 merged PRs)
説æ
ð 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