Skip to content

Missing constraint error in instantiation expression for a nested classΒ #61982

Open
@Andarist

Description

@Andarist

πŸ”Ž Search Terms

instantiation expression caching class expression declaration type arguments type parameter

πŸ•— Version & Regression Information

⏯ Playground Link

https://www.typescriptlang.org/play/?ts=5.9.0-dev.20250701#code/MYGwhgzhAECCA8AVaBeaA7ArgWwEYFMAnAPmgG8AoaaANzBE3wEIAuaRAbiumAAsBLEABNW0AJLoIAFzDpg+RAE8ADvnhSV+APYAzOADoAQvASJi5jtAD0V6FIEwIvLZmHQihLYQrdpYKfzA0IaoPOBQwUjuAB5S+OhCMLChsKSU1NTKYITxUqKc3AC+XIUUQA

πŸ’» Code

class A<T = number> {
  value!: T;
  child!: InstanceType<typeof A.B<A<T>>>; // this should error

  static B = class B<T extends A = A> {
    parent!: T;
  };
}

πŸ™ Actual behavior

It doesn't error

πŸ™‚ Expected behavior

it should error with:

Type 'A<T>' does not satisfy the constraint 'A<number>'.
  Type 'T' is not assignable to type 'number'.(2344)

like it did in 5.6: TS playground

Additional information about the issue

The problem here is that the situation is a little bit circular and variances worker gets hits in reentrant manner. The nested call returns emptyArray that is a signal for structuredTypeRelatedToWorker to return Ternary.Unknown.

So checkTypeArguments called by getInstantiatedSignatures doesn't report an error. In the old version of the code, this would be re-called after the variance worker would completely exit and the error would be raised.

I see 2 ways to solve this:

  • ignore the introduced caching based inVarianceComputation to avoid spoiling this
  • defer checkTypeArguments in getInstantiatedSignatures (well, call it with /*reportErrors*/ false and defer anoher call with /*reportErrors*/ true)

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugA bug in TypeScriptHelp WantedYou can do this

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions