Skip to content

instantiation expression usage leading to an invalid d.ts file generationΒ #60758

Open
@AlexisTessier

Description

@AlexisTessier

πŸ”Ž Search Terms

partial function generic application, function generic variant from another function, instantiation-expressions

πŸ•— Version & Regression Information

  • This changed between versions 5.6.2 and 5.7.2

⏯ Playground Link

https://www.typescriptlang.org/play/?ts=5.7.2#code/C4TwDgpgBAyg9gWwgBQE50q0BpCIDOUAvFAEoQCGAJnAHYA2IAgqqhSADxoYRYi4gAfAChQkKE2AcmUCAA9gEWlULlqdRizacArrQDWtOAHdaggDRQAkrIVKVUWjoQAjXsUfO3qQR6YBtKwBdYWF5MDgsKAAzPQBjYABLOigECkTaAQBxHQpUKg5hKChsW0VlQlRKGgYQKH9uTBw8SwA6dvgkRt5mgiDzYUEACiKofTx8AC4SgYBKaY4AFTL7QjgXACsIBOHRgDcKeh0IacW54l8Do+hEwgBRBTYEpctyOMiCyQ5sSwAGCygekMJjMvgA3qMqsAdKhaFAlisKlB1lsdiNisUrsdTgNivMoFibvdHhRnmcyNsPtIpD8oP9LECjKZBL4iODRsUoTC4eMCP5fkEoBkCYdjqMAL7CSWicDQABicDgHjBMUVAEZpvhgKgMgBzSzRRUAJk12r1UElYmgACE8sqoC48hqoFqdbR9Q68iaXWb3RaZeIFXBbagPEGoAAfKAh4TvWhaz2oASEEj+ADkjtQarTlgzXrTgoohDjWrCcgiURLwCF+BDHjSGWyuXyQ0zydmHCDIZEoSAA

πŸ’» Code

type SomePropertyKeys = ReadonlyArray<PropertyKey>
type At<A extends ReadonlyArray<unknown>, I extends number = number> = A[I]

export function mainKeyGuard<
  K extends readonly [PropertyKey, ...SomePropertyKeys],
>(
  keys: K,
): <T extends object>(
  value: T,
) => value is Extract<T, Record<At<K, 0>, unknown>> {
  return <T extends object>(
    value: T,
  ): value is Extract<T, Record<At<K, 0>, unknown>> => {
    return keys[0] in value
  }
}

type Foo = { foo1: string, foo2: string }
type Bar = { bar1: string, bar2: string }
type FooBar = Foo | Bar
const barKeys = ['bar1', 'bar2'] as const
export const isBar = mainKeyGuard(barKeys)<FooBar>

πŸ™ Actual behavior

Starting with the v5.7.2, the generated d.ts file declares isBar as a function which reference a missing generic type T, so an error is raised

export declare const isBar: (value: FooBar) => value is Extract<T, Record<At<K, 0>, unknown>>;

πŸ™‚ Expected behavior

I would expect the isBar function d.ts declaration to not reference a missing generic type T.
Previously, the generated d.ts file behaved like the following

export declare const isBar: (value: FooBar) => value is Bar;

Additional information about the issue

The title mentions "instantiation expression" but I'm not totally sure about how the involved feature is actually named

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