TypeScript/tests/baselines/reference/genericRestParameters1.types
Anders Hejlsberg 6aeb8c12cc
Preserve type aliases for union and intersection types (#42149)
* Create separate types for equivalent aliased unions

* Accept new baselines

* Preserve original types for union types

* Accept new baselines

* Preserve intersection origin for union types

* Accept new baselines

* Accept new baselines

* Preserve aliases during relationship checks

* Accept new baselines

* Preserve aliases for intersection and indexed access types

* Accept new baselines

* Compute intersection-of-unions cross product without recursion

* Accept new baselines

* Use denormalized type objects for origin / support 'keyof' origins

* Accept new baselines

* Fix fourslash test

* Recursively extract named union types

* Accept new baselines

* Map on union origin in mapType to better preserve aliases and origins

* Remove redundant call

* Accept new baselines

* Revert back to declared type when branches produce equivalent union

* Accept new baselines

* Don't include denormal origin types in regular type statistics

* Fix issue with unions not being marked primitive-only

* Allow new alias to be associated with type alias instantiation

* Accept new baselines

* Revert "Accept new baselines"

This reverts commit 4507270cc1.

* Revert "Allow new alias to be associated with type alias instantiation"

This reverts commit 2c2d06dfe1.
2021-01-08 15:19:58 -10:00

799 lines
22 KiB
Plaintext

=== tests/cases/conformance/types/rest/genericRestParameters1.ts ===
declare let f1: (...x: [number, string, boolean]) => void;
>f1 : (x_0: number, x_1: string, x_2: boolean) => void
>x : [number, string, boolean]
declare let f2: (x0: number, x1: string, x2: boolean) => void;
>f2 : (x0: number, x1: string, x2: boolean) => void
>x0 : number
>x1 : string
>x2 : boolean
f1 = f2;
>f1 = f2 : (x0: number, x1: string, x2: boolean) => void
>f1 : (x_0: number, x_1: string, x_2: boolean) => void
>f2 : (x0: number, x1: string, x2: boolean) => void
f2 = f1;
>f2 = f1 : (x_0: number, x_1: string, x_2: boolean) => void
>f2 : (x0: number, x1: string, x2: boolean) => void
>f1 : (x_0: number, x_1: string, x_2: boolean) => void
declare const t3: [number, string, boolean];
>t3 : [number, string, boolean]
declare const t2: [string, boolean];
>t2 : [string, boolean]
declare const t1: [boolean];
>t1 : [boolean]
declare const t0: [];
>t0 : []
declare const ns: [number, string];
>ns : [number, string]
declare const sn: [string, number];
>sn : [string, number]
f1(42, "hello", true);
>f1(42, "hello", true) : void
>f1 : (x_0: number, x_1: string, x_2: boolean) => void
>42 : 42
>"hello" : "hello"
>true : true
f1(t3[0], t3[1], t3[2]);
>f1(t3[0], t3[1], t3[2]) : void
>f1 : (x_0: number, x_1: string, x_2: boolean) => void
>t3[0] : number
>t3 : [number, string, boolean]
>0 : 0
>t3[1] : string
>t3 : [number, string, boolean]
>1 : 1
>t3[2] : boolean
>t3 : [number, string, boolean]
>2 : 2
f1(...t3);
>f1(...t3) : void
>f1 : (x_0: number, x_1: string, x_2: boolean) => void
>...t3 : string | number | boolean
>t3 : [number, string, boolean]
f1(42, ...t2);
>f1(42, ...t2) : void
>f1 : (x_0: number, x_1: string, x_2: boolean) => void
>42 : 42
>...t2 : string | boolean
>t2 : [string, boolean]
f1(42, "hello", ...t1);
>f1(42, "hello", ...t1) : void
>f1 : (x_0: number, x_1: string, x_2: boolean) => void
>42 : 42
>"hello" : "hello"
>...t1 : boolean
>t1 : [boolean]
f1(42, "hello", true, ...t0);
>f1(42, "hello", true, ...t0) : void
>f1 : (x_0: number, x_1: string, x_2: boolean) => void
>42 : 42
>"hello" : "hello"
>true : true
>...t0 : never
>t0 : []
f1(ns[0], ns[1], true);
>f1(ns[0], ns[1], true) : void
>f1 : (x_0: number, x_1: string, x_2: boolean) => void
>ns[0] : number
>ns : [number, string]
>0 : 0
>ns[1] : string
>ns : [number, string]
>1 : 1
>true : true
f1(...ns, true); // FIXME: Error, since ...ns is considered as string|number here
>f1(...ns, true) : void
>f1 : (x_0: number, x_1: string, x_2: boolean) => void
>...ns : string | number
>ns : [number, string]
>true : true
f2(42, "hello", true);
>f2(42, "hello", true) : void
>f2 : (x0: number, x1: string, x2: boolean) => void
>42 : 42
>"hello" : "hello"
>true : true
f2(t3[0], t3[1], t3[2]);
>f2(t3[0], t3[1], t3[2]) : void
>f2 : (x0: number, x1: string, x2: boolean) => void
>t3[0] : number
>t3 : [number, string, boolean]
>0 : 0
>t3[1] : string
>t3 : [number, string, boolean]
>1 : 1
>t3[2] : boolean
>t3 : [number, string, boolean]
>2 : 2
f2(...t3);
>f2(...t3) : void
>f2 : (x0: number, x1: string, x2: boolean) => void
>...t3 : string | number | boolean
>t3 : [number, string, boolean]
f2(42, ...t2);
>f2(42, ...t2) : void
>f2 : (x0: number, x1: string, x2: boolean) => void
>42 : 42
>...t2 : string | boolean
>t2 : [string, boolean]
f2(42, "hello", ...t1);
>f2(42, "hello", ...t1) : void
>f2 : (x0: number, x1: string, x2: boolean) => void
>42 : 42
>"hello" : "hello"
>...t1 : boolean
>t1 : [boolean]
f2(42, "hello", true, ...t0);
>f2(42, "hello", true, ...t0) : void
>f2 : (x0: number, x1: string, x2: boolean) => void
>42 : 42
>"hello" : "hello"
>true : true
>...t0 : never
>t0 : []
f2(ns[0], ns[1], true);
>f2(ns[0], ns[1], true) : void
>f2 : (x0: number, x1: string, x2: boolean) => void
>ns[0] : number
>ns : [number, string]
>0 : 0
>ns[1] : string
>ns : [number, string]
>1 : 1
>true : true
f2(...ns, true); // FIXME: Error, since ...ns is considered as string|number here
>f2(...ns, true) : void
>f2 : (x0: number, x1: string, x2: boolean) => void
>...ns : string | number
>ns : [number, string]
>true : true
declare function f10<T extends unknown[]>(...args: T): T;
>f10 : <T extends unknown[]>(...args: T) => T
>args : T
const x10 = f10(42, "hello", true); // [number, string, boolean]
>x10 : [number, string, boolean]
>f10(42, "hello", true) : [number, string, boolean]
>f10 : <T extends unknown[]>(...args: T) => T
>42 : 42
>"hello" : "hello"
>true : true
const x11 = f10(42, "hello"); // [number, string]
>x11 : [number, string]
>f10(42, "hello") : [number, string]
>f10 : <T extends unknown[]>(...args: T) => T
>42 : 42
>"hello" : "hello"
const x12 = f10(42); // [number]
>x12 : [number]
>f10(42) : [number]
>f10 : <T extends unknown[]>(...args: T) => T
>42 : 42
const x13 = f10(); // []
>x13 : []
>f10() : []
>f10 : <T extends unknown[]>(...args: T) => T
const x14 = f10(...t3); // [number, string, boolean]
>x14 : [number, string, boolean]
>f10(...t3) : [number, string, boolean]
>f10 : <T extends unknown[]>(...args: T) => T
>...t3 : string | number | boolean
>t3 : [number, string, boolean]
const x15 = f10(42, ...t2); // [number, string, boolean]
>x15 : [number, string, boolean]
>f10(42, ...t2) : [number, string, boolean]
>f10 : <T extends unknown[]>(...args: T) => T
>42 : 42
>...t2 : string | boolean
>t2 : [string, boolean]
const x16 = f10(42, "hello", ...t1); // [number, string, boolean]
>x16 : [number, string, boolean]
>f10(42, "hello", ...t1) : [number, string, boolean]
>f10 : <T extends unknown[]>(...args: T) => T
>42 : 42
>"hello" : "hello"
>...t1 : boolean
>t1 : [boolean]
const x17 = f10(42, "hello", true, ...t0); // [number, string, boolean]
>x17 : [number, string, boolean]
>f10(42, "hello", true, ...t0) : [number, string, boolean]
>f10 : <T extends unknown[]>(...args: T) => T
>42 : 42
>"hello" : "hello"
>true : true
>...t0 : never
>t0 : []
const x18 = f10(...ns, true); // (string | number | boolean)[]
>x18 : [number, string, boolean]
>f10(...ns, true) : [number, string, boolean]
>f10 : <T extends unknown[]>(...args: T) => T
>...ns : string | number
>ns : [number, string]
>true : true
function g10<U extends string[], V extends [number, number]>(u: U, v: V) {
>g10 : <U extends string[], V extends [number, number]>(u: U, v: V) => void
>u : U
>v : V
let x1 = f10(...u); // U
>x1 : U
>f10(...u) : U
>f10 : <T extends unknown[]>(...args: T) => T
>...u : string
>u : U
let x2 = f10(...v); // V
>x2 : V
>f10(...v) : V
>f10 : <T extends unknown[]>(...args: T) => T
>...v : number
>v : V
let x3 = f10(1, ...u); // [number, ...string[]]
>x3 : [number, ...U]
>f10(1, ...u) : [number, ...U]
>f10 : <T extends unknown[]>(...args: T) => T
>1 : 1
>...u : string
>u : U
let x4 = f10(...u, ...v); // (string | number)[]
>x4 : [...U, ...V]
>f10(...u, ...v) : [...U, ...V]
>f10 : <T extends unknown[]>(...args: T) => T
>...u : string
>u : U
>...v : number
>v : V
}
declare function f11<T extends (string | number | boolean)[]>(...args: T): T;
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>args : T
const z10 = f11(42, "hello", true); // [42, "hello", true]
>z10 : [42, "hello", true]
>f11(42, "hello", true) : [42, "hello", true]
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>42 : 42
>"hello" : "hello"
>true : true
const z11 = f11(42, "hello"); // [42, "hello"]
>z11 : [42, "hello"]
>f11(42, "hello") : [42, "hello"]
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>42 : 42
>"hello" : "hello"
const z12 = f11(42); // [42]
>z12 : [42]
>f11(42) : [42]
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>42 : 42
const z13 = f11(); // []
>z13 : []
>f11() : []
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
const z14 = f11(...t3); // [number, string, boolean]
>z14 : [number, string, boolean]
>f11(...t3) : [number, string, boolean]
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>...t3 : string | number | boolean
>t3 : [number, string, boolean]
const z15 = f11(42, ...t2); // [42, string, boolean]
>z15 : [42, string, boolean]
>f11(42, ...t2) : [42, string, boolean]
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>42 : 42
>...t2 : string | boolean
>t2 : [string, boolean]
const z16 = f11(42, "hello", ...t1); // [42, "hello", boolean]
>z16 : [42, "hello", boolean]
>f11(42, "hello", ...t1) : [42, "hello", boolean]
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>42 : 42
>"hello" : "hello"
>...t1 : boolean
>t1 : [boolean]
const z17 = f11(42, "hello", true, ...t0); // [42, "hello", true]
>z17 : [42, "hello", true]
>f11(42, "hello", true, ...t0) : [42, "hello", true]
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>42 : 42
>"hello" : "hello"
>true : true
>...t0 : never
>t0 : []
const z18 = f11(...ns, true); // (string | number | true)[]
>z18 : [number, string, true]
>f11(...ns, true) : [number, string, true]
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>...ns : string | number
>ns : [number, string]
>true : true
function g11<U extends string[], V extends [number, number]>(u: U, v: V) {
>g11 : <U extends string[], V extends [number, number]>(u: U, v: V) => void
>u : U
>v : V
let x1 = f11(...u); // U
>x1 : U
>f11(...u) : U
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>...u : string
>u : U
let x2 = f11(...v); // V
>x2 : V
>f11(...v) : V
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>...v : number
>v : V
let x3 = f11(1, ...u); // [1, ...string[]]
>x3 : [1, ...U]
>f11(1, ...u) : [1, ...U]
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>1 : 1
>...u : string
>u : U
let x4 = f11(...u, ...v); // (string | number)[]
>x4 : [...U, ...V]
>f11(...u, ...v) : [...U, ...V]
>f11 : <T extends (string | number | boolean)[]>(...args: T) => T
>...u : string
>u : U
>...v : number
>v : V
}
function call<T extends unknown[], U>(f: (...args: T) => U, ...args: T) {
>call : <T extends unknown[], U>(f: (...args: T) => U, ...args: T) => U
>f : (...args: T) => U
>args : T
>args : T
return f(...args);
>f(...args) : U
>f : (...args: T) => U
>...args : unknown
>args : T
}
function callr<T extends unknown[], U>(args: T, f: (...args: T) => U) {
>callr : <T extends unknown[], U>(args: T, f: (...args: T) => U) => U
>args : T
>f : (...args: T) => U
>args : T
return f(...args);
>f(...args) : U
>f : (...args: T) => U
>...args : unknown
>args : T
}
declare function f15(a: string, b: number): string | number;
>f15 : (a: string, b: number) => string | number
>a : string
>b : number
declare function f16<A, B>(a: A, b: B): A | B;
>f16 : <A, B>(a: A, b: B) => A | B
>a : A
>b : B
let x20 = call((x, y) => x + y, 10, 20); // number
>x20 : number
>call((x, y) => x + y, 10, 20) : number
>call : <T extends unknown[], U>(f: (...args: T) => U, ...args: T) => U
>(x, y) => x + y : (x: number, y: number) => number
>x : number
>y : number
>x + y : number
>x : number
>y : number
>10 : 10
>20 : 20
let x21 = call((x, y) => x + y, 10, "hello"); // string
>x21 : string
>call((x, y) => x + y, 10, "hello") : string
>call : <T extends unknown[], U>(f: (...args: T) => U, ...args: T) => U
>(x, y) => x + y : (x: number, y: string) => string
>x : number
>y : string
>x + y : string
>x : number
>y : string
>10 : 10
>"hello" : "hello"
let x22 = call(f15, "hello", 42); // string | number
>x22 : string | number
>call(f15, "hello", 42) : string | number
>call : <T extends unknown[], U>(f: (...args: T) => U, ...args: T) => U
>f15 : (a: string, b: number) => string | number
>"hello" : "hello"
>42 : 42
let x23 = call(f16, "hello", 42); // unknown
>x23 : string | number
>call(f16, "hello", 42) : string | number
>call : <T extends unknown[], U>(f: (...args: T) => U, ...args: T) => U
>f16 : <A, B>(a: A, b: B) => A | B
>"hello" : "hello"
>42 : 42
let x24 = call<[string, number], string | number>(f16, "hello", 42); // string | number
>x24 : string | number
>call<[string, number], string | number>(f16, "hello", 42) : string | number
>call : <T extends unknown[], U>(f: (...args: T) => U, ...args: T) => U
>f16 : <A, B>(a: A, b: B) => A | B
>"hello" : "hello"
>42 : 42
let x30 = callr(sn, (x, y) => x + y); // string
>x30 : string
>callr(sn, (x, y) => x + y) : string
>callr : <T extends unknown[], U>(args: T, f: (...args: T) => U) => U
>sn : [string, number]
>(x, y) => x + y : (x: string, y: number) => string
>x : string
>y : number
>x + y : string
>x : string
>y : number
let x31 = callr(sn, f15); // string | number
>x31 : string | number
>callr(sn, f15) : string | number
>callr : <T extends unknown[], U>(args: T, f: (...args: T) => U) => U
>sn : [string, number]
>f15 : (a: string, b: number) => string | number
let x32 = callr(sn, f16); // string | number
>x32 : string | number
>callr(sn, f16) : string | number
>callr : <T extends unknown[], U>(args: T, f: (...args: T) => U) => U
>sn : [string, number]
>f16 : <A, B>(a: A, b: B) => A | B
function bind<T, U extends unknown[], V>(f: (x: T, ...rest: U) => V, x: T) {
>bind : <T, U extends unknown[], V>(f: (x: T, ...rest: U) => V, x: T) => (...rest: U) => V
>f : (x: T, ...rest: U) => V
>x : T
>rest : U
>x : T
return (...rest: U) => f(x, ...rest);
>(...rest: U) => f(x, ...rest) : (...rest: U) => V
>rest : U
>f(x, ...rest) : V
>f : (x: T, ...rest: U) => V
>x : T
>...rest : unknown
>rest : U
}
declare const f20: (x: number, y: string, z: boolean) => string[];
>f20 : (x: number, y: string, z: boolean) => string[]
>x : number
>y : string
>z : boolean
const f21 = bind(f20, 42); // (y: string, z: boolean) => string[]
>f21 : (y: string, z: boolean) => string[]
>bind(f20, 42) : (y: string, z: boolean) => string[]
>bind : <T, U extends unknown[], V>(f: (x: T, ...rest: U) => V, x: T) => (...rest: U) => V
>f20 : (x: number, y: string, z: boolean) => string[]
>42 : 42
const f22 = bind(f21, "hello"); // (z: boolean) => string[]
>f22 : (z: boolean) => string[]
>bind(f21, "hello") : (z: boolean) => string[]
>bind : <T, U extends unknown[], V>(f: (x: T, ...rest: U) => V, x: T) => (...rest: U) => V
>f21 : (y: string, z: boolean) => string[]
>"hello" : "hello"
const f23 = bind(f22, true); // () => string[]
>f23 : () => string[]
>bind(f22, true) : () => string[]
>bind : <T, U extends unknown[], V>(f: (x: T, ...rest: U) => V, x: T) => (...rest: U) => V
>f22 : (z: boolean) => string[]
>true : true
f20(42, "hello", true);
>f20(42, "hello", true) : string[]
>f20 : (x: number, y: string, z: boolean) => string[]
>42 : 42
>"hello" : "hello"
>true : true
f21("hello", true);
>f21("hello", true) : string[]
>f21 : (y: string, z: boolean) => string[]
>"hello" : "hello"
>true : true
f22(true);
>f22(true) : string[]
>f22 : (z: boolean) => string[]
>true : true
f23();
>f23() : string[]
>f23 : () => string[]
declare const g20: (x: number, y?: string, z?: boolean) => string[];
>g20 : (x: number, y?: string | undefined, z?: boolean | undefined) => string[]
>x : number
>y : string | undefined
>z : boolean | undefined
const g21 = bind(g20, 42); // (y: string, z: boolean) => string[]
>g21 : (y?: string | undefined, z?: boolean | undefined) => string[]
>bind(g20, 42) : (y?: string | undefined, z?: boolean | undefined) => string[]
>bind : <T, U extends unknown[], V>(f: (x: T, ...rest: U) => V, x: T) => (...rest: U) => V
>g20 : (x: number, y?: string | undefined, z?: boolean | undefined) => string[]
>42 : 42
const g22 = bind(g21, "hello"); // (z: boolean) => string[]
>g22 : (z?: boolean | undefined) => string[]
>bind(g21, "hello") : (z?: boolean | undefined) => string[]
>bind : <T, U extends unknown[], V>(f: (x: T, ...rest: U) => V, x: T) => (...rest: U) => V
>g21 : (y?: string | undefined, z?: boolean | undefined) => string[]
>"hello" : "hello"
const g23 = bind(g22, true); // () => string[]
>g23 : () => string[]
>bind(g22, true) : () => string[]
>bind : <T, U extends unknown[], V>(f: (x: T, ...rest: U) => V, x: T) => (...rest: U) => V
>g22 : (z?: boolean | undefined) => string[]
>true : true
g20(42, "hello", true);
>g20(42, "hello", true) : string[]
>g20 : (x: number, y?: string | undefined, z?: boolean | undefined) => string[]
>42 : 42
>"hello" : "hello"
>true : true
g20(42, "hello");
>g20(42, "hello") : string[]
>g20 : (x: number, y?: string | undefined, z?: boolean | undefined) => string[]
>42 : 42
>"hello" : "hello"
g20(42);
>g20(42) : string[]
>g20 : (x: number, y?: string | undefined, z?: boolean | undefined) => string[]
>42 : 42
g21("hello", true);
>g21("hello", true) : string[]
>g21 : (y?: string | undefined, z?: boolean | undefined) => string[]
>"hello" : "hello"
>true : true
g21("hello");
>g21("hello") : string[]
>g21 : (y?: string | undefined, z?: boolean | undefined) => string[]
>"hello" : "hello"
g21();
>g21() : string[]
>g21 : (y?: string | undefined, z?: boolean | undefined) => string[]
g22(true);
>g22(true) : string[]
>g22 : (z?: boolean | undefined) => string[]
>true : true
g22();
>g22() : string[]
>g22 : (z?: boolean | undefined) => string[]
g23();
>g23() : string[]
>g23 : () => string[]
declare function f30<T, U extends ((x: T) => any)[]>(x: T, ...args: U): U;
>f30 : <T, U extends ((x: T) => any)[]>(x: T, ...args: U) => U
>x : T
>x : T
>args : U
const c30 = f30(42, x => "" + x, x => x + 1); // [(x: number) => string, (x: number) => number]
>c30 : [(x: number) => string, (x: number) => number]
>f30(42, x => "" + x, x => x + 1) : [(x: number) => string, (x: number) => number]
>f30 : <T, U extends ((x: T) => any)[]>(x: T, ...args: U) => U
>42 : 42
>x => "" + x : (x: number) => string
>x : number
>"" + x : string
>"" : ""
>x : number
>x => x + 1 : (x: number) => number
>x : number
>x + 1 : number
>x : number
>1 : 1
type T01 = Parameters<(x: number, y: string, z: boolean) => void>;
>T01 : [x: number, y: string, z: boolean]
>x : number
>y : string
>z : boolean
type T02 = Parameters<(...args: [number, string, boolean]) => void>;
>T02 : [number, string, boolean]
>args : [number, string, boolean]
type T03 = ConstructorParameters<new (x: number, y: string, z: boolean) => void>;
>T03 : [x: number, y: string, z: boolean]
>x : number
>y : string
>z : boolean
type T04 = ConstructorParameters<new (...args: [number, string, boolean]) => void>;
>T04 : [number, string, boolean]
>args : [number, string, boolean]
type T05<T> = Parameters<(...args: T[]) => void>;
>T05 : T[]
>args : T[]
type T06<T> = ConstructorParameters<new (...args: []) => void>;
>T06 : []
>args : []
type T07<T extends any[]> = Parameters<(...args: T) => void>;
>T07 : T
>args : T
type T08<T extends any[]> = ConstructorParameters<new (...args: T) => void>;
>T08 : T
>args : T
type T09 = Parameters<Function>;
>T09 : never
type Record1 = {
>Record1 : Record1
move: [number, 'left' | 'right'];
>move : [number, "left" | "right"]
jump: [number, 'up' | 'down'];
>jump : [number, "up" | "down"]
stop: string;
>stop : string
done: [];
>done : []
}
type EventType<T> = {
>EventType : EventType<T>
emit<K extends keyof T = keyof T>(e: K, ...payload: T[K] extends any[] ? T[K] : [T[K]]): void;
>emit : <K extends keyof T = keyof T>(e: K, ...payload: T[K] extends any[] ? T[K] : [T[K]]) => void
>e : K
>payload : T[K] extends any[] ? T[K] : [T[K]]
}
declare var events: EventType<Record1>;
>events : EventType<Record1>
events.emit('move', 10, 'left');
>events.emit('move', 10, 'left') : void
>events.emit : <K extends keyof Record1 = keyof Record1>(e: K, ...payload: Record1[K] extends any[] ? Record1[K] : [Record1[K]]) => void
>events : EventType<Record1>
>emit : <K extends keyof Record1 = keyof Record1>(e: K, ...payload: Record1[K] extends any[] ? Record1[K] : [Record1[K]]) => void
>'move' : "move"
>10 : 10
>'left' : "left"
events.emit('jump', 20, 'up');
>events.emit('jump', 20, 'up') : void
>events.emit : <K extends keyof Record1 = keyof Record1>(e: K, ...payload: Record1[K] extends any[] ? Record1[K] : [Record1[K]]) => void
>events : EventType<Record1>
>emit : <K extends keyof Record1 = keyof Record1>(e: K, ...payload: Record1[K] extends any[] ? Record1[K] : [Record1[K]]) => void
>'jump' : "jump"
>20 : 20
>'up' : "up"
events.emit('stop', 'Bye!');
>events.emit('stop', 'Bye!') : void
>events.emit : <K extends keyof Record1 = keyof Record1>(e: K, ...payload: Record1[K] extends any[] ? Record1[K] : [Record1[K]]) => void
>events : EventType<Record1>
>emit : <K extends keyof Record1 = keyof Record1>(e: K, ...payload: Record1[K] extends any[] ? Record1[K] : [Record1[K]]) => void
>'stop' : "stop"
>'Bye!' : "Bye!"
events.emit('done');
>events.emit('done') : void
>events.emit : <K extends keyof Record1 = keyof Record1>(e: K, ...payload: Record1[K] extends any[] ? Record1[K] : [Record1[K]]) => void
>events : EventType<Record1>
>emit : <K extends keyof Record1 = keyof Record1>(e: K, ...payload: Record1[K] extends any[] ? Record1[K] : [Record1[K]]) => void
>'done' : "done"
// Repro from #25871
declare var ff1: (... args: any[]) => void;
>ff1 : (...args: any[]) => void
>args : any[]
declare var ff2: () => void;
>ff2 : () => void
declare var ff3: (...args: []) => void;
>ff3 : () => void
>args : []
declare var ff4: (a: never) => void;
>ff4 : (a: never) => void
>a : never
ff1 = ff2;
>ff1 = ff2 : () => void
>ff1 : (...args: any[]) => void
>ff2 : () => void
ff1 = ff3;
>ff1 = ff3 : () => void
>ff1 : (...args: any[]) => void
>ff3 : () => void
ff1 = ff4; // Error
>ff1 = ff4 : (a: never) => void
>ff1 : (...args: any[]) => void
>ff4 : (a: never) => void