TypeScript icon indicating copy to clipboard operation
TypeScript copied to clipboard

Parameters created from tuple are treated as mutable instead of immutable, unless written as "...args"

Open jakebailey opened this issue 2 years ago • 2 comments

Bug Report

🔎 Search Terms

const array tuple parameter spread

🕗 Version & Regression Information

  • This is the behavior in every version I tried,.

⏯ Playground Link

Playground Link

💻 Code

declare function each<T extends ReadonlyArray<any>>(cases: ReadonlyArray<T>): (fn: (...args: T) => any) => void;

const cases = [
    [1, '1'],
    [2, '2'],
] as const;

const eacher = each(cases);

// Error.
eacher((a, b) => {
});

// No error?
eacher((...args) => {
    const [a, b] = args;
});

🙁 Actual behavior

Argument of type '(a: 1 | 2, b: "1" | "2") => void' is not assignable to parameter of type '(...args: readonly [1, "1"] | readonly [2, "2"]) => any'.
  Types of parameters 'a' and 'args' are incompatible.
    Type 'readonly [1, "1"] | readonly [2, "2"]' is not assignable to type '[a: 1 | 2, b: "1" | "2"]'.
      The type 'readonly [1, "1"]' is 'readonly' and cannot be assigned to the mutable type '[a: 1 | 2, b: "1" | "2"]'.(2345)

Obviously they're not assignable, but why did we come up with [a: 1 | 2, b: "1" | "2"] and not readonly [a: 1 | 2, b: "1" | "2"]?

🙂 Expected behavior

No error, as though it had been expanded separately.

See also: https://github.com/DefinitelyTyped/DefinitelyTyped/pull/64739

jakebailey avatar Mar 14 '23 20:03 jakebailey

Followup is here: #53398

jakebailey avatar Mar 20 '23 21:03 jakebailey

Fix has been reverted.

jakebailey avatar Mar 23 '23 19:03 jakebailey

will there ever be a fix for this issue or has it been abandoned?

mProjectsCode avatar Sep 18 '23 15:09 mProjectsCode

No, I just haven't come up with a fix for it, and have been working on other issues.

jakebailey avatar Sep 18 '23 19:09 jakebailey