Я разобрал суть моей проблемы со следующими кодами:
полный исходный код
У меня есть Базовый класс и Derived, Derived2:
class Base {
static get type() {
return 'Base';
}
}
class Derived extends Base {
}
class Derived2 extends Base {
}
Теперь у меня есть переменная t, которая может быть экземпляром Derived или Derived2.Он также может быть изменен несколько раз в течение времени выполнения.
/** @type {Base} */
var t = new Derived();
//or
var t = new Derived2();
И у меня есть функция, которая проверяет, является ли t экземпляром переданного класса, и возвращает t, если это экземпляр переданного класса или не определено иначе.
/**
* @template {typeof Base} T
* @param {T} cl
* @returns {T} /// <-- I can't figure out how o return an instance of T
*/
function checkTop( cl ) {
if ( t instanceof cl ) {
return t;
}
return undefined;
}
Когда я вызываю checkTop (Derived), его тип возвращаемого значения должен быть Derived.Но с вышеупомянутым jsdoc, его тип возвращаемого значения 'typeof Derived'.Но я хочу сделать тип возвращаемого значения просто «Derived».
let d1 = checkTop( Derived ); // 'typeof Derived', but I want 'Derived' as return type
аналогично, d2 распознается как «typeof Derived2»
let d2 = checkTop( Derived2 ); // 'typeof Derived2'.. but I want 'Derived2' as return type
Как указать тип возврата в JSDOC, чтобы checkTop( Derived );
имел тип возврата как Derived
, а возвращение checkTop( Derived2 )
тип 'Derived2'.
Я попытался выполнить следующее для типа возвращаемого значения:
/**
* @template {Base} B
* @template {typeof B} T
* @param {T} cl
* @returns {B}
*/
function checkTop( cl )
и
/**
* @template {typeof Base} T
* @param {T} cl
* @returns {instanceof T}
*/
function checkTop( cl )
Если это невозможно в JSDOC, но возможно в машинописи, это также будет полезно, но я предпочитаю решение JSDOC.