当前位置: 首页 > 知识库问答 >
问题:

在typescript中为泛型函数编写JSdoc

钦侯林
2023-03-14

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

完整来源

我有基类和Derive, Derived2:

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

当我调用Check Top(Derive)时,它的返回类型应该是Derive。但是在上面的jsdoc中,它的返回类型是“typeof Derive”。但是我想让返回类型只是“Derive”。

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

同样,d2被识别为“衍生类型2”

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

我如何在JSDOC中指定返回类型,以便checkTop(派生)的返回类型为派生的,并且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中不可能,但在打字稿中可以,那也会很有帮助,但我更喜欢JSDOC解决方案。

共有3个答案

萧业
2023-03-14

您已经询问了至少在打字脚本中是否可能。是的。只要删除你的JSDoc评论,你就会有一个你想要的建议。

为了获得许可,你可以只做一个评论,只说明它返回的内容。这就够了。

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

桑坚成
2023-03-14

我可能误解了这里的提问,但我认为您只需要返回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;
}
莫宁
2023-03-14

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

/**
* @template {Base} T
* @param {new T} cl
* @returns {T}
*/
function checkTop( cl ) {
    if ( t instanceof cl ) {
        return t;
    }
    return undefined;
}
 类似资料:
  • 问题内容: 我知道Go将来不会有泛型,并且有一些建议可以用其他结构代替它们。但是在下面的例子中,我陷入了困境。 您可能会猜到,我试图使任何错误均告失败,并且希望将任何返回两个结果的函数放到第二个错误中。这工作正常,但丢失了它的类型信息,并且结果中只是一个空接口。 由于我也正在调用lib函数,因此我看不到使用Interfaces或Reflection解决此问题的方法。 有任何想法吗?我是完全走错了道

  • 所以我学会了如何在打字稿中进行扩展: 但是如何从中制作一个吸气剂?例如: 所以我可以在代码someArray.lastIndex中调用is作为getter? 我找到了这个答案,但代码无法为泛型类型编译,这样写也很丑陋,但也许我在打字稿中要求太多:如何使用 get 属性扩展打字稿类?

  • 如何为动态创建的函数声明泛型类型? 我如何在中使用并传递? < code>useFoo的预期用法

  • 我想通过TypeScript泛型定义函数返回类型。所以R可以是我将定义的任何东西。 <代码>。。。许诺 错误:(29,9)TS2322:类型“字符串”不可分配给类型“R”。“字符串”可分配给类型“R”的约束,但“R”可以用约束“{}”的不同子类型实例化。

  • (沙盒) 获取此错误: 类型“number”不可分配给类型“T”“number”可分配给“T”类型的约束,但“T”可以用约束{}的不同子类型实例化。(2322)输入。ts(1,26):预期类型来自此签名的返回类型。 我希望typescript能够自动推断T为数字,然后直接使用它。为什么它在抱怨?写这样的东西的正确方法是什么?谢谢

  • 问题内容: 我想创建一个KeyValue类,但以通用方式,这就是我写的内容: 错误显示:“令牌“>上的语法错误”,此令牌后应有标识符” 那我该如何在Java中创建一个通用构造函数呢? 问题答案: 您需要从构造函数的签名中删除:它已经隐式存在。