繁体   English   中英

如何为具有扩展接口的泛型类型的函数参数做 TypeScript tsdoc 文档?

[英]How to do TypeScript tsdoc documentation for function argument with generic type that extends an interface?

考虑以下代码,注意someField的文档:

interface Test {
    /**
     * Some description.
     * lorum ipsum.
     * foo bar.
     */
    someField: string;
}

function withGeneric<T extends Test>(arg: T) {
    return arg;
}

function withoutGeneric(arg: Test) {
    return arg;
}

withGeneric({
    someField: ""
});

withoutGeneric({
    someField: ""
});

当我悬停我的鼠标someFieldwithoutGeneric通话,VSCode很好地显示我的文档:

在此处输入图片说明

但是,在withGeneric调用someField悬停在someField时,不会显示文档:

在此处输入图片说明

有没有办法使 tsdoc 文档也与通用参数一起使用?

考虑到当您创建内联对象时,它的类型不是Test

const config = {
    someField: ""
};

根据定义,您的withoutGeneric函数采用Test类型的参数,因此 TypeScript 可以推断属性类型。 但是,当您的函数是泛型但您没有显式设置泛型类型时,TypeScript 将从内联对象的类型推断泛型类型,这只是您在上面看到的默认推断类型。

您可以在智能感知中看到这一点:

TypeScript 将泛型类型推断为{ someField: string; } { someField: string; } . 这满足了Test接口的要求,但是值是它自己推断的默认类型,而不是Test

考虑以下示例:

interface Foobar {
    /**
     * Unrelated doc string
     */
    someField: string;
}

const config:Foobar = {
    someField: ""
}

您将获得以下智能感知:

请注意, Foobar类型满足withGeneric函数,因为它具有所需的属性并且它们是正确的类型。 但是,与someField关联的文档字符串将是Unrelated doc string因为这是config变量的类型。

如果您显式设置函数的泛型类型,那么它会按您的预期运行。

withGeneric<Test>({
    someField: ""
});

产生以下结果:

如果您明确地将类型设置为Foobar ,那么您将获得 Foobar 的文档字符串:

withGeneric<Foobar>({
    someField: ""
});

产量:

我找到了一个适合我的目的的答案。 添加具有扩展自类型的联合:

/**
 * withGeneric sample
 * @typeParam T - must be a Test
 * @param arg 
 * @returns 
 */
function withGeneric<T extends Test>(arg: T & Test) {
    return arg;
}

现在 VSCode 确实显示了文档:

在此处输入图片说明

感觉就像一个把戏,但我看不出它有什么缺点?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM