microsoft / microsoft/TypeScript
Intra expression inference doesn't work within reverse mapped types
まだ誰も着手していません。
- 主要言語
- Go
- スター
- 111k
- フォーク
- 14.3k
- 平均マージ
- 1日 19時間
- マージ済み PR(30日)
- 117
説明
Bug Report
🔎 Search Terms
intra expression inference reverse mapped type
🕗 Version & Regression Information
- This is the behavior in every version I tried
⏯ Playground Link
Playground link with relevant code (object variant)
Playground link with relevant code (tuple variant)
💻 Code
declare function f<T>(
arg: {
[K in keyof T]: {
produce: (n: string) => T[K];
consume: (x: T[K]) => void;
};
}
): void;
// Works
f({
a: {
produce: () => "hello",
consume: (x) => x.toLowerCase(),
},
});
// Works
f({
a: {
produce: (n: string) => n,
consume: (x) => x.toLowerCase(),
},
});
// still doesn't work, even with "Improved Function Inference in Objects and Methods" aka intra-expression inference sites
f({
a: {
produce: (n) => n,
consume: (x) => x.toLowerCase(),
},
});
// still doesn't work, even with "Improved Function Inference in Objects and Methods" aka intra-expression inference sites
f({
a: {
produce: function () {
return "hello";
},
consume: (x) => x.toLowerCase(),
},
});
// still doesn't work, even with "Improved Function Inference in Objects and Methods" aka intra-expression inference sites
f({
a: {
produce() {
return "hello";
},
consume: (x) => x.toLowerCase(),
},
});
🙁 Actual behavior
This kind of inference that was improved in https://github.com/microsoft/TypeScript/pull/48538 doesn't work within a reverse mapped type.
🙂 Expected behavior
It should work in the same way as it does outside of the reverse mapped type. The code in the playground is almost literally taken from the 4.7 announcement blog post about this improvement (here). The only difference is that the produce/consume "pair" is within a property of reverse mapped type
Part of the problem is likely in that inferReverseMappedType calls inferTypes with separate inferences here:
https://github.dev/microsoft/TypeScript/blob/e2283e99b47942b863d016c65a3e430dca1549b9/src/compiler/checker.ts#L23938-L23939
and that is not linked anyhow to the current inference context and inferFromIntraExpressionSites tries to infer this kind of stuff from context.intraExpressionInferenceSites+context.inferences and the latter won't be present for the computed reverse mapped type inference:
https://github.dev/microsoft/TypeScript/blob/e2283e99b47942b863d016c65a3e430dca1549b9/src/compiler/checker.ts#L23756-L23763
However, I also noticed that inferReverseMappedType is not called at all in this case so those inferences for it aren't even gathered in the first place.
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
リンクされている2つの Playground の例から始め、続いて src/compiler/checker.ts の inferReverseMappedType と inferFromIntraExpressionSites を調べます。引用されている推論呼び出しとコンテキスト処理も含めて確認してください。完了の条件は、reverse mapped type 内の注釈のない produce 関数と consume 関数が動作する例と一貫して推論され、報告されたコードが型チェックを通ることです。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- typescript
- 領域
- compilers
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 38/100