![](/img/trans.png)
[英]Typescript: use specific extended interface to satisfy generic “extends” type argument?
[英]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: ""
});
当我悬停我的鼠标someField
在withoutGeneric
通话,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: ""
});
产量:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.