Skip to content

Functions with fewer parameters NOT assignable to functions with more parameters defined as tuples unionΒ #56766

Open
@AntonNevsgodov

Description

@AntonNevsgodov

πŸ”Ž Search Terms

"tuple union" "tuple spread"

πŸ•— Version & Regression Information

This is the behavior in every version I tried, and I reviewed the FAQ for entries about

⏯ Playground Link

Playground Link

πŸ’» Code

type Numbers = [a: number, b: number];
type Strings = [a: string, b: string];

type TupleArgs = (...args: Numbers) => void;
const f1: TupleArgs = (a) => console.log(a); // πŸ‘Œ

type SignatureOverload = { (...args: Numbers): void; (...args: Strings): void; }
type FnsIntersection = ((...args: Numbers) => void) & ((...args: Strings) => void);
type TuplesUnionArgs = (...args: Numbers | Strings) => void;

const f2: SignatureOverload = (a) => console.log(a); // πŸ‘Œ
const f3: FnsIntersection = (a) => console.log(a); // πŸ‘Œ
const f4: TuplesUnionArgs = (a) => console.log(a); // ❌

/**
 * Type '(a: string | number) => void' is not assignable to type 'TuplesUnionArgs'.
 *   Types of parameters 'a' and 'args' are incompatible.
 *     Type 'Numbers | Strings' is not assignable to type '[a: string | number]'.
 *       Type 'Numbers' is not assignable to type '[a: string | number]'.
 *         Source has 2 element(s) but target allows only 1.(2322)
 */

πŸ™ Actual behavior

Type '(a: string | number) => void' is not assignable to type 'TuplesUnionArgs'.
  Types of parameters 'a' and 'args' are incompatible.
    Type 'Numbers | Strings' is not assignable to type '[a: string | number]'.
      Type 'Numbers' is not assignable to type '[a: string | number]'.
        Source has 2 element(s) but target allows only 1. (2322)

πŸ™‚ Expected behavior

(a: string | number) => void should be assignable to (...args: [a: number, b: number] | [a: string, b: string]) => void

Additional information about the issue

Since this issue has 2 pretty clean workarounds (signature overload, functions intersection), it is not critical.
But it is an instance of inconsistent behaviour (which is annoying).

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugA bug in TypeScriptHelp WantedYou can do this

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions