Skip to content

With two (or more) optional type parameters, when the second type argument depends on the first, and the function is called with one type argument, the second is improperly inferred. #57052

Closed as not planned
@alex-eliot

Description

@alex-eliot

🔎 Search Terms

first type argument second type argument optional cannot be inferred
optional type argument wrongly inferred
when first type argument is passed, second one is not inferred

🕗 Version & Regression Information

Occurs on 5.4.0

⏯ Playground Link

https://www.typescriptlang.org/play?ts=5.4.0-dev.20240113#code/GYVwdgxgLglg9mABBATgUwIZTQeQEYBWa0APAFCKIAqiaAHtmACYDOiLUKMYA5ogLztO3HgBoKiHLQZpmbAErE4KJiSqjEACgCUAgHyIMYAJ4HBiiMtXqtu-gaOmyBzQGs0xlgC5qAbQC6GnCEPji6AN4S6FAgKEjBBGQAvmRklmAciOhsgqiY2PhE0Jq+AOTAcHClGqV4GCilgYiRlBVwPjr6iKUYLEzVEnUoHXYGPX2lydqpAPQzyAiZ2T6Rc5SIbSNdHFy8ANxka5RDW-ZCuzwHaylpi1BZaCwATALI6Fi4hMRQJOWVpYgAD7dIalPQlP5VGqgpotDaVU5jXr9cTHeqI7rIyZJaaHebpJaPJ4+CxWEgAIja5KBiHJQ3JGk6Z0ceiAA

💻 Code

function createObject<
  T extends string = string,
  O extends Record<T, () => any> = Record<T, () => any>
> (keys: T[], obj: O) {
  return obj
}

const res = createObject(['foo', 'bar'], {
  foo: () => 'asd',
  bar: () => 'asd'
})

// const res: {
//   foo: () => string;
//   bar: () => string;
// }

const res2 = createObject<'foo' | 'bar'>(['foo', 'bar'], {
  foo: () => 'asd',
  bar: () => 'asd'
})

// const res2: Record<"foo" | "bar", () => any>

🙁 Actual behavior

When the first type argument is passed, the second one is not inferred properly.

🙂 Expected behavior

The inferrence of the two code examples should be identical.

Additional information about the issue

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    DuplicateAn existing issue was already created

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions