Javascript 在typescript中为泛型函数编写JSdoc

Javascript 在typescript中为泛型函数编写JSdoc,javascript,visual-studio-code,jsdoc,Javascript,Visual Studio Code,Jsdoc,我已通过以下代码提炼出问题的本质: 我有基类、派生类和派生类2: class Base { static get type() { return 'Base'; } } class Derived extends Base { } class Derived2 extends Base { } 现在我有了变量t,它可以是派生的或派生的2的实例。它也可以在运行时多次更改 /** @type {Base} */ var t = new Derived(); /

我已通过以下代码提炼出问题的本质:

我有基类、派生类和派生类2:

class Base {
    static get type() {
        return 'Base';
    }
}

class Derived extends Base {
}

class Derived2 extends Base {
}
现在我有了变量t,它可以是派生的或派生的2的实例。它也可以在运行时多次更改

/** @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 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;
}

同样,d2被认为是“衍生类型2”

let d2 = checkTop( Derived2 ); // 'typeof Derived2'.. but I want 'Derived2' as return type

如何在JSDOC中指定返回类型,以便
checkTop(派生)
的返回类型为
派生的
,而
复选框(Derived2)
的返回类型为“Derived2”

我尝试了以下返回类型:

/**
 * @template {Base} B 
 * @template {typeof B} T
 * @param {T} cl
 * @returns {B}
 */
function checkTop( cl )


如果在JSDOC中不可能,但在typescript中可能,这也会有帮助,但我更喜欢JSDOC解决方案。

我可能误解了这里的提问,但我认为您只需要返回cl而不是返回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 cl;
    }
    return undefined;
}
/**
*@template{typeof Base}T
*@param{T}cl

*@returns{T}//您已经询问了case是否至少在TypeScript中可能。是的。只要删除你的JSDoc评论,你就会有一个你想要的建议

为了获得许可,你只需发表评论,只说明它返回的内容。够了


你只是用你的断言重写了正确的TypeScript建议(程序员的意见被认为比TypeScript的建议更重要,因为程序员在明确指定某个内容时知道自己在做什么)。

所以我在互联网上读到了关于jsdoc的文章,下面是我的结论 我找到了要求的结果

看到截图并感到高兴,问题解决了

那么在jsDocs中有什么帮助呢

以下是代码片段


您可以尝试使用Typescript
Generics
来实现您想要实现的功能,最好使用Typescript特性而不是JSDOCS

试试下面的代码,它可以正常工作

   class Base
   {
       static get type() {
           return 'Base';
       }
   }
  
   class Derived extends Base {}

   class Derived2 extends Base {}
  
   var t : Derived = new Derived();
   var t1 : Derived2= new Derived2();
  
   function checkTop <GT>(genericValue: GT){
       return genericValue;
   }

   var d1 = checkTop(t);
   var d2 = checkTop(t1);

将模板定义为需要返回的类型,将参数定义为该类型的构造函数
/**
*@template{Base}T
*@param{new T}cl
*@returns{T}
*/
功能检查台(cl){
if(cl的t实例){
返回t;
}
返回未定义;

}
。Console显示为d1派生的类型的对象,为d2未定义的类型的对象。也许我误解了什么?@Chipster我使用的是vscode,它被认为是d2的“typeof Derived2”。我添加了截图。返回类型是T,它扩展了{typeof Base},所以它至少应该有一个“typeof something”。但是我想删除'typeof'并将返回类型识别为一个实例。'typeof Derived1'返回{},而'typeof Derived2'为null,checkTop()函数将始终返回变量的类型,因为您传递一个调用已准备就绪的类,您可以返回派生类declaredclass派生扩展基{}的'cl'console.log(派生);//返回函数(){…}控制台(新派生的())///返回对象{}//,因为它已经被调用了,因为基本上您返回的对象只是一个实例。同时,您希望显示一个返回类型。类型是对象。您可以在注释中指定它是对象的实例。我的目的是“返回t”并更改返回类型以反映它:以某种方式指定返回类型是cl的实例。那么
const d2=chekTop(Derived2)
呢?我想要d2的类型被识别为Derived2。我想要一个单一的
checkTop
函数
t
可以在运行时更改。我只是编写
checkTop
函数以供参考(只是向您展示),如果您编写单个函数并在运行时更改
t
,它将正常工作,只需尝试此jscode模板我尝试过但不起作用
checkTop(Derived2)
的返回类型为我想要的派生非Derived2@typedef什么也没做,也没有@return。简短的解释可能会有用。
/**
 * @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 cl;
    }
    return undefined;
}
/**
 * @typedef {Object} 
 * @param {c1}
 */
class Base {
  static get type() {
      return 'Base';
  }
}

class Derived extends Base {
}

class Derived2 extends Base {
}

var t = new Derived();
var t1 = new Derived2();

/**
 * @typedef {Object} 
 * @param {c1}
 */
function checkTop( cl ) {
  if ( t instanceof cl ) {
      return t;
  }
  return undefined;
}

/**
 * @typedef {Object} 
 * @param {c1}
 */
function checkTop2( cl ) {
  if ( t1 instanceof cl ) {
      return t1;
  }
  return undefined;
}
var d1 = checkTop(Derived);
var d2 = checkTop2(Derived2);
   class Base
   {
       static get type() {
           return 'Base';
       }
   }
  
   class Derived extends Base {}

   class Derived2 extends Base {}
  
   var t : Derived = new Derived();
   var t1 : Derived2= new Derived2();
  
   function checkTop <GT>(genericValue: GT){
       return genericValue;
   }

   var d1 = checkTop(t);
   var d2 = checkTop(t1);
declare type A = { id: string }
declare type B = { name: string }

function get<T>(obj: T): T {
    return obj;
}

var obj1: A = {id : "Jarvis"};
var obj2: B = {name : "Tony Stark"};

var objectTypeA = get(obj1);


var objectTypeB = get(obj2);