Ошибка перегрузок в JSDoc в отличии от TypeScript
Описание
Создаю простые классы для работы с векторами 1D и 2D в TypeScript. В нем так же добавляю "оператор +" с перегрузками чтобы было удобнее работать:
class Vector1 {
static ["+"](vector: Readonly<Vector1>, scalar: number): Vector1;
static ["+"](first: Readonly<Vector1>, second: Readonly<Vector1>): Vector1;
static ["+"](arg1: Readonly<Vector1>, arg2: Readonly<Vector1> | number): Vector1 {
// Код не важен
return new Vector1();
}
x: number;
}
class Vector2 extends Vector1 {
static ["+"](vector: Readonly<Vector2>, scalar: number): Vector2;
static ["+"](first: Readonly<Vector2>, second: Readonly<Vector1>): Vector2;
static ["+"](first: Readonly<Vector2>, second: Readonly<Vector2>): Vector2;
static ["+"](arg1: Readonly<Vector2>, arg2: Readonly<Vector2> | Readonly<Vector1> | number): Vector2 {
// Код не важен
return new Vector2();
}
y: number;
}
С этим проблем нет, отлично компилируется. Но, если я пытаюсь тот же код написать с JavaScript + JSDoc при включенной проверки типизации...
class Vector1 {
/**
* @overload
* @param {Readonly<Vector1>} vector
* @param {number} scalar
* @returns {Vector1}
*/
/**
* @overload
* @param {Readonly<Vector1>} first
* @param {Readonly<Vector1>} second
* @returns {Vector1}
*/
/**
* @param {Readonly<Vector1>} arg1
* @param {Readonly<Vector1> | number} arg2
* @returns {Vector1}
*/
static ["+"](arg1, arg2) {
return new Vector1();
}
/** @type {number} */
x;
}
class Vector2 extends Vector1 {
/**
* @overload
* @param {Readonly<Vector2>} vector
* @param {number} scalar
* @returns {Vector2}
*/
/**
* @overload
* @param {Readonly<Vector2>} first
* @param {Readonly<Vector1>} second
* @returns {Vector2}
*/
/**
* @overload
* @param {Readonly<Vector2>} first
* @param {Readonly<Vector2>} second
* @returns {Vector2}
*/
/**
* @param {Readonly<Vector2>} arg1
* @param {Readonly<Vector2> | Readonly<Vector1> | number} arg2
* @returns {Vector2}
*/
static ["+"](arg1, arg2) {
return new Vector2();
}
/** @type {number} */
y;
}
... то у компилятора бурные эмоции:
Class static side 'typeof Vector2' incorrectly extends base class static side 'typeof Vector1'.
Types of property '["+"]' are incompatible.
Type '{ (vector: Readonly, scalar: number): Vector2; (first: Readonly, second: Readonly): Vector2; (first: Readonly<...>, second: Readonly<...>): Vector2; }' is not assignable to type '{ (vector: Readonly, scalar: number): Vector1; (first: Readonly, second: Readonly): Vector1; }'.
Types of parameters 'vector' and 'vector' are incompatible.
Property 'y' is missing in type 'Readonly' but required in type 'Readonly'.ts(2417)
Вопрос
- В чем собственно разница? Ведь проверку в обоих случаях выполняет компилятор TS.
- Как решить данную проблему? Все-таки от перегрузок отказаться не хочется.
Дополнительно
Конфигурации:
{
"javascript.format.semicolons": "insert",
"javascript.inlayHints.enumMemberValues.enabled": true,
"javascript.inlayHints.variableTypes.enabled": true,
"javascript.inlayHints.propertyDeclarationTypes.enabled": true,
"javascript.updateImportsOnFileMove.enabled": "always",
"javascript.referencesCodeLens.enabled": true,
"javascript.referencesCodeLens.showOnAllFunctions": true,
"javascript.inlayHints.functionLikeReturnTypes.enabled": true,
"javascript.suggest.classMemberSnippets.enabled": false
"typescript.format.semicolons": "insert",
"typescript.preferences.importModuleSpecifier": "project-relative",
"typescript.implementationsCodeLens.enabled": true,
"typescript.referencesCodeLens.enabled": true,
"typescript.referencesCodeLens.showOnAllFunctions": true,
"typescript.updateImportsOnFileMove.enabled": "always",
"typescript.inlayHints.enumMemberValues.enabled": true,
"typescript.inlayHints.functionLikeReturnTypes.enabled": true,
"typescript.inlayHints.propertyDeclarationTypes.enabled": true,
"typescript.inlayHints.variableTypes.enabled": true
"js/ts.implicitProjectConfig.checkJs": true,
"js/ts.implicitProjectConfig.target": "ESNext",
"js/ts.implicitProjectConfig.experimentalDecorators": true,
}
Ответы (1 шт):
Проблема оказалось багом.
Составил баг-тикет в GitHub, Microsoft подтвердили данный баг.
Слежу за обновлениями. Если будет что-то серьезное, добавлю в ответ, если не забуду. :)