- 
                Notifications
    You must be signed in to change notification settings 
- Fork 13.1k
Closed
Labels
Design LimitationConstraints of the existing architecture prevent this from being fixedConstraints of the existing architecture prevent this from being fixed
Description
Bug Report
Adding an implementation of an interface allows an invalid assignability check of the interface to pass
🔎 Search Terms
assignability, unnecessary implementation
🕗 Version & Regression Information
- This changed between versions 3.7.5 and 3.8.3
It's still present in all versions including nightly.
⏯ Playground Link
Playground link with relevant code
Thanks @MartinJohns for the link
💻 Code
interface Parent<A, B> {
  getChild(): Child<A, B>;
  iter(): Iterable<Parent<A, B>>;
}
interface Child<A, B>
  extends Parent<A, B> {
  readonly a: A;
  readonly b: B;
}
class Impl<A, B> implements Parent<A, B> {
  constructor(readonly child: Child<A, B>) {
  }
  getChild(): Child<A, B> {
    return this.child;
  }
  *iter(): Iterable<Parent<A, B>> {
    const map = new Map<Child<unknown, unknown>, Child<A, B>[]>();
    function* gen(
      inp: Child<A, B>
    ): Iterable<Child<A, B>> {
      yield* map.get(inp) || [];
    }
  }
}
const x: Parent<unknown, unknown> = {} as any;
const _: Parent<null, unknown> = x; // should not passThe final assignment should not pass. It accurately errors in 3.7.5,  if the Impl class is removed (or any aspect of the iter implementation is modified), or by adding a sentinel type like sentinel?: A to the Parent interface to aid in type checking.
🙁 Actual behavior
No error is thrown in the final assignment.
🙂 Expected behavior
A n error is throw:
Type 'Parent<unknown, unknown>' is not assignable to type 'Parent<null, unknown>'.
  Type 'unknown' is not assignable to type 'null'.
RyanCavanaugh and zyhouwhzx5byb
Metadata
Metadata
Assignees
Labels
Design LimitationConstraints of the existing architecture prevent this from being fixedConstraints of the existing architecture prevent this from being fixed