Skip to content

TypeScript emits d.ts file that is invalid for complex mapped type. #56718

Closed
@CraigMacomber

Description

@CraigMacomber

🔎 Search Terms

d.ts emit type error

🕗 Version & Regression Information

  • This is a compile error when consuming a d.ts file emitting by the same version and configuration of TypeScript
  • This repros in all versions I have tested (5.0.6, 5.1.6 and 5.3.2)
  • Earlier version error when compiling the input file, so they could not run this scenario.

⏯ Playground Link

https://www.typescriptlang.org/play?module=1#code/KYDwDg9gTgLgBAMwK4DsDGMCWEV2CpAWwDEoJCBlGKTFAcwGcAeNHB+AWWEICNgoGeEDHwATQVGABDUTgA2ATzjsa9ANoBdAHwAKAJRwA3gCg4cGArDA4ABSmwAjHAC8R02bhqA1sCW04PgoQCHBcvPyCUoJhfALevhpCIijiytS0dO4ecAD8odyxDPEKGlkeAFxwKMAAbvwalTERxRoA3O4Avu1mFla29jAATC5GnjZkVrB+uIHB-Y4N8zAOauMQkxaJXe6SMEhQuADyPABWwBgAdGiSUiI6BHJyBlFLg+0dxkA

💻 Code

export function enumFromStrings<const Members extends readonly string[]>() {
  type Part1 = {
    [key in keyof Members as Members[key] extends string
      ? Members[key]
      : never]: Members[key];
  };
  type Part2 = { [Property in keyof Part1]: Part1[Property] };
  return Object.create(null) as Part2;
}

🙁 Actual behavior

Emits d.ts:

export declare function enumFromStrings<const Members extends readonly string[]>(): { [Property in keyof { [key in keyof Members as Members[key] extends string ? Members[key] : never]: Members[key]; }]: { [key in keyof Members as Members[key] extends string ? Members[key] : never]: Members[key]; }[Property]; };

Which errors:

Type 'Property' cannot be used to index type '{ [key in keyof Members as Members[key] extends string ? Members[key] : never]: Members[key]; }'.

In playground

🙂 Expected behavior

I expect TypeScript to either error when trying to emit a d.ts file, or generate a valid d.ts file it can consume without error.

Additional information about the issue

I have a workaround for the case where I hit this, so I'm mainly reporting this incase it helps TypeScript development.

Metadata

Metadata

Assignees

Labels

BugA bug in TypeScriptFix AvailableA PR has been opened for this issue

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions