microsoft / microsoft/TypeScript

Incorrect conditional type evaluation on transformed function type expressions

Offen
#55,587 1 Kommentar 0 Reaktionen 1 zugewiesene Person Auf GitHub ansehen

@weswigham arbeitet bereits daran.

Seit 01.9.2023.

Needs Investigation
Vorherrschende Sprache
Go
Sterne
111k
Forks
14.4k
Ø Merge
1 T. 19 Std.
Gemergte PRs (30 T.)
117

Beschreibung

🔎 Search Terms

"conditional type", "function type", "extends", "evaluation", "inference"

🕗 Version & Regression Information

This is the behavior in every version I tried

⏯ Playground Link

https://www.typescriptlang.org/play?ts=4.7.4#code/PTAEEFQUwDwFygOwCYGdQCEBQcCeAHKCUAXlAAoA3AQwBsBXKALlFTgCcBLRAcwEpSAPlCUA9p2Q4CRDKQo0GzUAHIAFlFq1RygSWFiJWKYVAAxSGVMAecIKwh5dRizZdeu-eMnGip2ZasMOwcqJyUAFgAmDxEvIwc4dVAAY1EAW3x6BGQRMPRqdiJUjIKoHNT2QuTaPB9QAHkAaTlzaHgkNDNZAH5QDkZQFgAzOlQoAG57MFBQAD1u+LBEolEuHm46NvxC1FROUUR8wtBEUTg6xvqWm2FYBBR0ayDQXv6iYdGJqZm5he+AFVUnHQnAytCgaSQcGocH2iFAyFEUHQpzgbSBACNOGjlqBtqIMeC0nV6lcyABxG5te6dSnPV7sAYfWhjSYOGbzIx4EzWf7UjqPRDCMjkAB04oKPFQLH+7GohyGqzSAAUCtQ0qgrKq5ZCEOxNf9BIIYgAlKBwejsRD-aRWQ1c6SgSl8u4CsxC0hYGba9XmqD6u23doPUDcIb+0A+jX8kP0RAAa1OAHdEABtAC6XpeFHFosl0tAsvlqEV7BVao1WorqGNQlAZotVpthEDWZYiCglH9DpMRYVSqjBuFoAA3qBU81uKB41BcKIhoX0yxmq6QzO5wuM9n-hP04NC7uY501BotMps1F9zvGnuAL6TOqmeFkHMS9hSljy3AZmJxxOiFNxiAA

💻 Code
// A extends B
type A = (value: string) => void
type B = (value: 'hello') => void

type FA = F<A>
// (value: string) => void

type FB = F<B>
// (value: 42) => void

// the computed values are compared correclty
type OK = FA extends FB ? true : false;
// return false

// the original expressions are not
type KO = F<A> extends F<B> ? true : false;
// return true

// This implementation does not exhibit the problem
type OO = G<A> extends G<B> ? true : false;
// return false

type F<T extends Fn> = (...args: TransformParams<Parameters<T>>) => ReturnType<T>

type G<T extends Fn> =
  Parameters<T> extends infer Params extends unknown[]
  ? (...args: TransformParams<Params>) => ReturnType<T>
  : never

type TransformParams<T> = { [K in keyof T]: K extends keyof [] ? T[K] : T[K] extends 'hello' ? 42 : T[K] };

type Fn =  (...args: any[]) => unknown;
🙁 Actual behavior

The comparison of the expressions F<A> and F<B> is incorrect and is not equivalent to the comparison of their results.

🙂 Expected behavior

F<A> extends F<B> should be false because it should evaluate to ((value: string) => void) extends ((value: 42) => void), and string and 42 are unrelated.

Additional information about the issue

Interestingly, G, which should behave the same as F, does not exhibit the problem.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.