microsoft / microsoft/TypeScript
Incorrect conditional type evaluation on transformed function type expressions
オープン
@weswigham がすでに取り組んでいます。
2023年9月1日 から。
Needs Investigation
- 主要言語
- Go
- スター
- 111k
- フォーク
- 14.4k
- 平均マージ
- 1日 19時間
- マージ済み PR(30日)
- 117
説明
🔎 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.
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
評価
この issue はまだ評価されていません。