簡體   English   中英

在typescript中為泛型function編寫JSdoc

[英]Write JSdoc for generic function in typescript

我用以下代碼提煉了我的問題的本質:

完整來源

我有 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();

我有一個 function 檢查 t 是否是傳遞類的實例,如果它是傳遞的 class 的實例或未定義則返回 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 ) 時,它的返回類型應該是 Derived。 但是對於上面的 jsdoc,它的返回類型是“typeof Derived”。 但我想讓返回類型只是“派生”。

let d1 = checkTop( Derived ); // 'typeof Derived', but I want 'Derived' as return type

d1 被識別為“typeof Derived”

同樣,d2 被識別為“typeof Derived2”

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

d2 被識別為“typeof Derived2”

如何在 JSDOC 中指定返回類型,以便checkTop( Derived ); 返回類型為DerivedcheckTop( 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

我可能誤解了這里的問題,但我認為您只需要返回 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;
}

您已經詢問了案例是否至少在 TypeScript 中是可能的。 是的。 只需刪除您的 JSDoc 評論,您就會得到您正在尋找的建議。

為了獲得許可,您可以發表評論,只說明它返回的內容。 就夠了。

在此處輸入圖片說明 在此處輸入圖片說明

您只是通過斷言重寫了正確的 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);

下面是我是如何做到這一點的...構造函數類型應鍵入為{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() }

您可以嘗試使用 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);

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM