microsoft / microsoft/TypeScript
TS2345 when calling a superclass' method with a conditional type parameter from a parameterized subclass
オープン
まだ誰も着手していません。
Bug
Domain: Conditional Types
- 主要言語
- Go
- スター
- 111k
- フォーク
- 14.4k
- 平均マージ
- 1日 19時間
- マージ済み PR(30日)
- 117
説明
TypeScript Version: 3.8.3 & 4.0.0-dev.20200506
Search Terms: TS2345 generic constructor super superclass method type parameter inheritance conditional type constraint
Code
type FilterKeysOf<T, Condition> = { [K in keyof T]: T[K] extends Condition ? K : never }[keyof T];
type ArrayKeysOf<T> = FilterKeysOf<T, readonly unknown[]>;
interface I {
foo: string;
bar: string[];
baz: number;
}
interface J extends I {
qux: boolean[];
}
class A<T extends I> {
protected treasure: T
constructor(treasure: T) {
this.treasure = treasure;
}
getArrayTreasure<K extends ArrayKeysOf<T>>(fieldName: K): T[K] {
return this.treasure[fieldName];
}
}
class B<T extends J> extends A<T> {
getQuxArrayTreasure(): boolean[] {
return super.getArrayTreasure('qux');
}
}
class C extends B<J> {
anyQux(): boolean {
return super.getArrayTreasure('qux').some(Boolean);
}
}
Expected behavior:
Compiles without errors.
Actual behavior:
TS v3.8.3:
foo.ts:25:35 - error TS2345: Argument of type '"qux"' is not assignable to parameter of type 'T[keyof T] extends readonly unknown[] ? keyof T : never'.
25 return super.getArrayTreasure('qux');
~~~~~
Found 1 error.
TS v4.0.0-dev.20200506:
foo.ts:25:5 - error TS2322: Type 'T[{ [K in keyof T]: T[K] extends readonly unknown[] ? K : never; }[keyof T]]' is not assignable to type 'boolean[]'.
Type 'T[T[keyof T] extends readonly unknown[] ? keyof T : never]' is not assignable to type 'boolean[]'.
Type 'T[keyof T]' is not assignable to type 'boolean[]'.
Type 'T[string] | T[number] | T[symbol]' is not assignable to type 'boolean[]'.
Type 'T[string]' is not assignable to type 'boolean[]'.
25 return super.getArrayTreasure('qux');
foo.ts:25:35 - error TS2345: Argument of type '"qux"' is not assignable to parameter of type 'T[keyof T] extends readonly unknown[] ? keyof T : never'.
25 return super.getArrayTreasure('qux');
~~~~~
Found 2 errors.
Playground Link:
Link
Related Issues:
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
リンクされた TypeScript Playground で、記載された TypeScript のバージョンを使って、提示されたジェネリック継承の例を再現してください。リポジトリのファイルもテストも指定されていないため、conditional types とスーパークラスのメソッド呼び出しに関するコンパイラの型チェック処理のパスを特定し、その後、報告された診断なしで例がコンパイルされることを示す回帰テストを追加してください。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- typescript
- 領域
- compilers
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100