Skip to content

A contextually-typed signature coming from correlated union can't be assigned back to source of its contextual typeΒ #61676

Open
@Andarist

Description

@Andarist

πŸ”Ž Search Terms

correlated union signature union map mapped type index

πŸ•— Version & Regression Information

  • This is the behavior in every version I tried

⏯ Playground Link

https://www.typescriptlang.org/play/?ts=5.9.0-dev.20250508#code/C4TwDgpgBAIhBmBLAdo4iD2yDOUC8UA3gFBRRYBiGGAXFANoCGATgOZ3ICuAtgEYTMAugG5S5ZACEWdJmzrZgzFKxHEAvqOKhIUAMoZuEAMKMANqd6MAxgGtcBEmXoBpKCig2IIDPFgIUaJg4gnQAFAB0kSys2HRwSKjoWNguggCU+AB8UABuGIgAJqIaxMRWycBQAO7MjGAm5pa2+FAAPK4QAB7AEMgFuJ7evvqGDRbWdpmhYtgYnMxWEHQjxmbjttgANGLA0RDAywarjRNbYoN0ztsZeNmOUOU4lVZrTTYts-OL9IOqO3vAH5eQQtCJRNjYG53MRkRC+UIAWUYwAAFuFan0DKEMtkAAzhACsGXuZDIzH282QD1eEzB4WikNEpKgajEJRKxHgnGQViSVJqdQAguZQi8ThtDqMaRs0pLjus7EQxI8FNVamBIAUWoQ1FBGLgVmM3tgmVB4BhmFBQqZ9h4vG4qWKFZClcyBfVpTZRZ6tmq6prNnaQHqBl4fHojkbTmlTayyRTmPz1ZrisQgA

πŸ’» Code

type Definitions = {
  onFoo: [arg: number];
  onBar: [arg: string];
};

type SomeCallbacks = {
  [K in keyof Definitions]: (...args: Definitions[K]) => void;
};

const wrapCallback = <K extends keyof SomeCallbacks>(
  source: SomeCallbacks,
  target: SomeCallbacks,
  key: K,
) => {
  const callback = source[key];

  target[key] = (...args) => {
    if (Math.random() > 0.5) {
      return callback(...args);
    }
  };
};

function wrapAll(callbacks: SomeCallbacks): SomeCallbacks {
  const wrapped = {} as SomeCallbacks;
  for (let key in callbacks) {
    wrapCallback(callbacks, wrapped, key as keyof SomeCallbacks);
  }
  return wrapped;
}

πŸ™ Actual behavior

It fails to recognize that this function is assignable to target[key] despite the fact that args are contextually-typed by that target[key]

πŸ™‚ Expected behavior

I'd expect this to typecheck just fine

Additional information about the issue

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions