在打字稿中为泛型函数编写 JSdoc

Write JSdoc for generic function in typescript

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

full source

我有 Base class,还有 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 是否是已传递的 class 的实例,如果它是已传递的 class 的实例,则 returns 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;
}

当我调用 checkTop( Derived ) 时,它的 return 类型应该是 Derived。但是上面的jsdoc,它的return类型是'typeof Derived'。 但是我想让 return 类型只是 '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 中指定 return 类型,以便 checkTop( Derived ); 的 return 类型为 Derived,而 checkTop( Derived2 ) 的 [=56] =] 类型是 'Derived2'.

我尝试按照 return 类型进行操作:

/**
 * @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 解决方案。

我可能误解了这里的问题,但我认为你只需要 return cl 而不是 returning 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;
}

你已经问过至少在 TypeScript 中是否可行。是的。只需删除您的 JSDoc 评论,您就会得到您正在寻找的建议。

为了清除,您可以只发表评论,只说明它的内容 returns。够了。

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

所以我在互联网上阅读了 jsdocs,这是我的结论 我找到了需要的结果

看到截图高兴,问题解决

那么在 jsDocs 中有什么帮助

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

您可以尝试使用 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);


在花了一些时间学习 TypeScript 之后,我开始了解我们 type

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);

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

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

我是这样实现的...构造函数类型应键入 {new() => T}

/**
 * @template {Base} T
 * @param {new() => T} cl
 * @returns {T}
 */
function checkTop( cl ) {
    if ( t instanceof cl ) {
        return t
    }
    
    // You should always return an instance
    // of cl unless the return type is {?T}
    return new cl()
}