=== tests/cases/compiler/restParameterAssignmentCompatibility.ts === class T { >T : T m(...p3) { >m : (...p3: any[]) => void >p3 : any[] } } class S { >S : S m(p1, p2) { >m : (p1: any, p2: any) => void >p1 : any >p2 : any } } var t: T; >t : T >T : T var s: S; >s : S >S : S // M is a non - specialized call or construct signature and S' contains a call or construct signature N where, // the number of non-optional parameters in N is less than or equal to the total number of parameters in M, t = s; // Should be valid (rest params correspond to an infinite expansion of parameters) >t = s : S >t : T >s : S class T1 { >T1 : T1 m(p1?, p2?) { >m : (p1?: any, p2?: any) => void >p1 : any >p2 : any } } var t1: T1; >t1 : T1 >T1 : T1 // When comparing call or construct signatures, parameter names are ignored and rest parameters correspond to an unbounded expansion of optional parameters of the rest parameter element type. t1 = s; // Similar to above, but optionality does not matter here. >t1 = s : S >t1 : T1 >s : S