[英]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
同樣,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 中不可能,但在 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;
}
所以我在互聯網上閱讀了 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.