tests/cases/compiler/varianceMeasurement.ts(10,7): error TS2322: Type 'Foo1<string>' is not assignable to type 'Foo1<"a">'.
  Type 'string' is not assignable to type '"a"'.
tests/cases/compiler/varianceMeasurement.ts(21,7): error TS2322: Type 'Foo2<string>' is not assignable to type 'Foo2<"a">'.
  Types of property 'x' are incompatible.
    Type 'string' is not assignable to type '"a"'.
tests/cases/compiler/varianceMeasurement.ts(22,7): error TS2322: Type 'Foo2<string>' is not assignable to type 'Foo2<unknown>'.
  The types of 'y.x' are incompatible between these types.
    Type '(arg: string) => void' is not assignable to type '(arg: unknown) => void'.
      Types of parameters 'arg' and 'arg' are incompatible.
        Type 'unknown' is not assignable to type 'string'.
tests/cases/compiler/varianceMeasurement.ts(33,7): error TS2322: Type 'Foo3<string>' is not assignable to type 'Foo3<"a">'.
  Type 'string' is not assignable to type '"a"'.
tests/cases/compiler/varianceMeasurement.ts(44,7): error TS2322: Type 'Foo4<string>' is not assignable to type 'Foo4<"a">'.
  Types of property 'x' are incompatible.
    Type 'string' is not assignable to type '"a"'.
tests/cases/compiler/varianceMeasurement.ts(45,7): error TS2322: Type 'Foo4<string>' is not assignable to type 'Foo4<unknown>'.
  The types of 'y.x' are incompatible between these types.
    Type '(arg: string) => void' is not assignable to type '(arg: unknown) => void'.
      Types of parameters 'arg' and 'arg' are incompatible.
        Type 'unknown' is not assignable to type 'string'.
tests/cases/compiler/varianceMeasurement.ts(57,7): error TS2322: Type 'Fn<string, number>' is not assignable to type 'Fn<unknown, number>'.
  Type 'unknown' is not assignable to type 'string'.
tests/cases/compiler/varianceMeasurement.ts(62,7): error TS2322: Type 'Fn<string, number>' is not assignable to type 'Fn<string, 0>'.
  Type 'number' is not assignable to type '0'.


==== tests/cases/compiler/varianceMeasurement.ts (8 errors) ====
    // The type below should be invariant in T but is measured as covariant because
    // we don't analyze recursive references.
    
    interface Foo1<T> {
      x: T;
      y: Foo1<(arg: T) => void>;
    }
    
    declare const f10: Foo1<string>;
    const f11: Foo1<'a'> = f10;
          ~~~
!!! error TS2322: Type 'Foo1<string>' is not assignable to type 'Foo1<"a">'.
!!! error TS2322:   Type 'string' is not assignable to type '"a"'.
    const f12: Foo1<unknown> = f10;
    
    // The type below is invariant in T and is measured as such.
    
    interface Foo2<T> {
      x: T;
      y: { x: (arg: T) => void, y: Foo2<(arg: T) => void>; }
    }
    
    declare const f20: Foo2<string>;
    const f21: Foo2<'a'> = f20;
          ~~~
!!! error TS2322: Type 'Foo2<string>' is not assignable to type 'Foo2<"a">'.
!!! error TS2322:   Types of property 'x' are incompatible.
!!! error TS2322:     Type 'string' is not assignable to type '"a"'.
    const f22: Foo2<unknown> = f20;
          ~~~
!!! error TS2322: Type 'Foo2<string>' is not assignable to type 'Foo2<unknown>'.
!!! error TS2322:   The types of 'y.x' are incompatible between these types.
!!! error TS2322:     Type '(arg: string) => void' is not assignable to type '(arg: unknown) => void'.
!!! error TS2322:       Types of parameters 'arg' and 'arg' are incompatible.
!!! error TS2322:         Type 'unknown' is not assignable to type 'string'.
    
    // The type below should be invariant in T but is measured as covariant because
    // we don't analyze recursive references.
    
    type Foo3<T> = {
      x: T;
      y: Foo3<(arg: T) => void>;
    }
    
    declare const f30: Foo3<string>;
    const f31: Foo3<'a'> = f30;
          ~~~
!!! error TS2322: Type 'Foo3<string>' is not assignable to type 'Foo3<"a">'.
!!! error TS2322:   Type 'string' is not assignable to type '"a"'.
    const f32: Foo3<unknown> = f30;
    
    // The type below is invariant in T and is measured as such.
    
    type Foo4<T> = {
      x: T;
      y: { x: (arg: T) => void, y: Foo4<(arg: T) => void>; }
    }
    
    declare const f40: Foo4<string>;
    const f41: Foo4<'a'> = f40;
          ~~~
!!! error TS2322: Type 'Foo4<string>' is not assignable to type 'Foo4<"a">'.
!!! error TS2322:   Types of property 'x' are incompatible.
!!! error TS2322:     Type 'string' is not assignable to type '"a"'.
    const f42: Foo4<unknown> = f40;
          ~~~
!!! error TS2322: Type 'Foo4<string>' is not assignable to type 'Foo4<unknown>'.
!!! error TS2322:   The types of 'y.x' are incompatible between these types.
!!! error TS2322:     Type '(arg: string) => void' is not assignable to type '(arg: unknown) => void'.
!!! error TS2322:       Types of parameters 'arg' and 'arg' are incompatible.
!!! error TS2322:         Type 'unknown' is not assignable to type 'string'.
    
    // Repro from #3580
    
    interface Fn<A, B> {
      (a: A): B;
      then<C>(next: Fn<B, C>): Fn<A, C>;
    }
    
    declare const fn: Fn<string, number>;
    
    // Contravariant in A
    const fn1: Fn<unknown, number> = fn;  // Error
          ~~~
!!! error TS2322: Type 'Fn<string, number>' is not assignable to type 'Fn<unknown, number>'.
!!! error TS2322:   Type 'unknown' is not assignable to type 'string'.
    const fn2: Fn<'a', number> = fn;
    
    // Covariant in B
    const fn3: Fn<string, unknown> = fn;
    const fn4: Fn<string, 0> = fn;  // Error
          ~~~
!!! error TS2322: Type 'Fn<string, number>' is not assignable to type 'Fn<string, 0>'.
!!! error TS2322:   Type 'number' is not assignable to type '0'.
    