microsoft / microsoft/TypeScript
Incorrect conditional type evaluation on transformed function type expressions
Offen
@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
💻 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
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Bewertung
Dieses Issue wurde noch nicht bewertet.