我用以下代码精炼了我的问题的本质:

full source

我有基类,并且有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,否则返回undefined。
/**
 * @template {typeof Base} T
 * @param {T} cl
 * @returns {T}  /// <-- I can't figure out how to return an instance of T
 * @returns {instanceof T} /// it's hypothetical, but I need this..
 */
function checkTop( cl ) {
    if ( t instanceof cl ) {
        return t;
    }
    return undefined;
}

当我调用checkTop(Derived)时,其返回类型应该为Derived。但是,在上面的jsdoc中,其返回类型为'typeof Derived'。
但我想将返回类型设为“派生”。
let d1 = checkTop( Derived ); // 'typeof Derived', but I want 'Derived' as return type

javascript - 在 typescript 中为通用函数编写JSdoc-LMLPHP

同样,d2被识别为“typeof Derived2”
let d2 = checkTop( Derived2 ); // 'typeof Derived2'.. but I want 'Derived2' as return type

javascript - 在 typescript 中为通用函数编写JSdoc-LMLPHP

如何在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中是不可能的,但在 typescript 中是不可能的,那也将有所帮助,但我更喜欢JSDOC解决方案。

最佳答案

将模板定义为您需要返回的类型,并将参数定义为该类型的构造函数

/**
* @template {Base} T
* @param {new T} cl
* @returns {T}
*/
function checkTop( cl ) {
    if ( t instanceof cl ) {
        return t;
    }
    return undefined;
}

结果将是:
function checkTop<T extends Base>(cl: new () => T): T

09-11 18:24