microsoft / microsoft/TypeScript
Signatures with less parameters aren't assignable to compatible targets with more when their rest param is an instantiated `NoInfer`
まだ誰も着手していません。
- 主要言語
- Go
- スター
- 111k
- フォーク
- 14.4k
- 平均マージ
- 1日 19時間
- マージ済み PR(30日)
- 117
説明
🔎 Search Terms
NoInfer signature parameters list rest
🕗 Version & Regression Information
- This is the behavior in every version I tried
⏯ Playground Link
💻 Code
declare function call<A extends readonly unknown[]>(
arg: (...args: NoInfer<A>) => void,
...args: A
): A;
// Argument of type '(a: number) => void' is not assignable to parameter of type '(...args: NoInfer<[number, number]>) => void'.
// Types of parameters 'a' and 'args' are incompatible.
// Type '[number, number]' is not assignable to type '[a: number]'.
// Source has 2 element(s) but target allows only 1.(2345)
const inferred = call((a: number) => {}, 1, 2);
// ^? function call<[number, number]>(arg: (...args: NoInfer<[number, number]>) => void, args_0: number, args_1: number): [number, number]
declare function call2<A extends readonly unknown[]>(
arg: (...args: A) => void,
...args: A
): A;
const inferred2 = call2<[number, number]>((a: number) => {}, 1, 2);
// ^? const inferred2: [number, number]
🙁 Actual behavior
The first call fails to typecheck
🙂 Expected behavior
Both of those calls use the same arguments. The first one is using NoInfer so the covariant inference can get prioritized. That prevents the instantiated signature from typechecking like the second one. Note that the first call infers the same type argument as the one that is supplied explicitly to the second call: [number, number]
Additional information about the issue
I think that this can be fixed by normalizing NoInfer<[A, B]> to [NoInfer<A>, NoInfer<B>]. This would be similar to what instantiateMappedTupleType does today at times.
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
リンクされている TypeScript Playground から始め、インスタンス化された NoInfer タプルを使って 2 つの呼び出しを再現します。タプルと rest パラメーターの代入可能性において checker が NoInfer をどのように扱うか、特に issue で示唆されている正規化の挙動を追跡します。推論された呼び出しと明示的に型付けされた呼び出しの両方が、期待される [number, number] タプルで型チェックを通れば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- typescript
- 領域
- compilers
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 42/100