microsoft / microsoft/TypeScript
Difference in overload pick between JS and TS with default generic type parameter
@sandersn がすでに取り組んでいます。
2020年7月8日 から。
- 主要言語
- Go
- スター
- 111k
- フォーク
- 14.3k
- 平均マージ
- 1日 19時間
- マージ済み PR(30日)
- 117
説明
TypeScript Version: 4.0.0-dev.20200703, 3.9.2 (playground)
Search Terms: js ts overload difference, javascript different overload, javascript wrong overload, javascript overload generic empty object
Code
definition.d.ts
export class EmptyObjectOverloads<T = {}> {
constructor(a: Readonly<T>);
/** @deprecated */
constructor(a: T, b?: any);
}
export class RecordOverloads<T = Record<string, any>> {
constructor(a: Readonly<T>);
/** @deprecated */
constructor(a: T, b?: any);
}
ts-example.ts
import { EmptyObjectOverloads, RecordOverloads } from './declaration';
class TSExampleEmpty extends EmptyObjectOverloads {
constructor(a: any) {
// hover over super: constructor EmptyObjectOverloads<{}>(a: Readonly<{}>): EmptyObjectOverloads<{}> (+1 overload)
super(a);
}
}
class TSExampleRecord extends RecordOverloads {
constructor(a: any) {
// hover over super: constructor RecordOverloads<Record<string, any>>(a: Readonly<Record<string, any>>): RecordOverloads<Record<string, any>> (+1 overload)
super(a);
}
}
js-example.js
class JSExampleEmpty extends EmptyObjectOverloads {
/** @param {*} a */
constructor(a) {
// hover over super: constructor EmptyObjectOverloads<any>(a: any, b?: any): EmptyObjectOverloads<any> (+1 overload)
super(a); // deprecation warning '(a: any, b?: any): EmptyObjectOverloads<any>' is deprecated ts(6385)
}
}
class JSExampleRecord extends RecordOverloads {
/** @param {*} a */
constructor(a) {
// hover over super: constructor RecordOverloads<Record<string, any>>(a: Readonly<Record<string, any>>): RecordOverloads<Record<string, any>> (+1 overload)
super(a);
}
}
Expected behavior:
Both TSExampleEmpty and JSExampleEmpty pick same overload similar to TSExampleRecord and JSExampleRecord.
Actual behavior:
TSExampleEmpty uses default generic value {} and picks first overload.
For JSExampleEmpty generic value to is any and second (deprecated) overload picked, while JSExampleRecord works as expected.
In real world examples this behavior marks all super(props); in React class components in JS files as deprecated.
Of course it's impossible to report TS issue without mentioning React 😆 related constructor declaration
Playground Link:
Example TS Example JS
Related Issues: Haven't found any
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
評価
この issue はまだ評価されていません。