export default class Signal<A = any, B = any, C = any, D = any, E = any, F = any, G = any, H = any> {
    add(listener: () => any, thisArg?: any): void
    add(listener: (a: A) => any, thisArg?: any): void
    add(listener: (a: A, b: B) => any, thisArg?: any): void
    add(listener: (a: A, b: B, c: C) => any, thisArg?: any): void
    add(listener: (a: A, b: B, c: C, d: D) => any, thisArg?: any): void
    add(listener: (a: A, b: B, c: C, d: D, e: E) => any, thisArg?: any): void
    add(listener: (a: A, b: B, c: C, d: D, e: E, f: F) => any, thisArg?: any): void
    add(listener: (a: A, b: B, c: C, d: D, e: E, f: F, g: G) => any, thisArg?: any): void
    add(listener: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H) => any, thisArg?: any): void

    addOne(listener: () => any, thisArg?: any): void
    addOne(listener: (a: A) => any, thisArg?: any): void
    addOne(listener: (a: A, b: B) => any, thisArg?: any): void
    addOne(listener: (a: A, b: B, c: C) => any, thisArg?: any): void
    addOne(listener: (a: A, b: B, c: C, d: D) => any, thisArg?: any): void
    addOne(listener: (a: A, b: B, c: C, d: D, e: E) => any, thisArg?: any): void
    addOne(listener: (a: A, b: B, c: C, d: D, e: E, f: F) => any, thisArg?: any): void
    addOne(listener: (a: A, b: B, c: C, d: D, e: E, f: F, g: G) => any, thisArg?: any): void
    addOne(listener: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H) => any, thisArg?: any): void

    remove(listener: () => any, thisArg?: any): void
    remove(listener: (a: A) => any, thisArg?: any): void
    remove(listener: (a: A, b: B) => any, thisArg?: any): void
    remove(listener: (a: A, b: B, c: C) => any, thisArg?: any): void
    remove(listener: (a: A, b: B, c: C, d: D) => any, thisArg?: any): void
    remove(listener: (a: A, b: B, c: C, d: D, e: E) => any, thisArg?: any): void
    remove(listener: (a: A, b: B, c: C, d: D, e: E, f: F) => any, thisArg?: any): void
    remove(listener: (a: A, b: B, c: C, d: D, e: E, f: F, g: G) => any, thisArg?: any): void
    remove(listener: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H) => any, thisArg?: any): void

    send0(): void

    send1(a: A): void

    send2(a: A, b: B): void

    send3(a: A, b: B, c: C): void

    send4(a: A, b: B, c: C, d: D): void

    send6(a: A, b: B, c: C, d: D, e: E, f: F): void

    send8(a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H): void

    /**
     * Prefer strongly typed dispatch methods instead (send0, send1 etc)
     */
    dispatch(...params: any[]): void

    promise(): Promise<[A, B, C, D, E, F, G, H]>

    /**
     * @deprecated
     */
    removeAll(): void
}
