首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSDoc泛型TypeScript

JSDoc泛型TypeScript
EN

Stack Overflow用户
提问于 2022-08-04 14:15:13
回答 1查看 209关注 0票数 1

我在一个使用JSDoc编译器检查的JavaScript项目中使用TypeScript。

在TypeScript中,我可以创建如下所示的泛型类型:

代码语言:javascript
复制
type Optional<TType extends string> = { type: TType; optional?: boolean; } | { type: `${TType}?` };
type OptionalThing = Optional<'thing'>;

OptionalThing的解析和扁平值现在如下:

代码语言:javascript
复制
type OptionalThing = 
  | { type: 'thing'; optional?: boolean; }
  | { type: 'thing?'; }

此类型创建一个类型联合,其中一个成员类型具有type字段的文字和const type值,它有一个额外的optional布尔字段,而另一个成员类型具有type字段的文字和const thing?,而没有optional字段。

?后缀在type上是一种简短的语法,用于在我解决的问题中标记为可选的东西,因此除了需要禁止指定optional之外,还需要禁止指定optional,否则就有可能表示无效的值:{ type: 'thing?', optional: false }

换言之:

代码语言:javascript
复制
/* These are allowed - they conform to the type */
const optionalThing1: OptionalThing = { type: 'thing?' };
const optionalThing2: OptionalThing = { type: 'thing', optional: true };
const optionalThing3: OptionalThing = { type: 'thing', optional: false };

// This is disallowed, `optional` cannot be specified while `type` has `?` suffix
const optionalThing4: OptionalThing = { type: 'thing?', optional: false };

// This is disallowed, `type` must be either `thing` or `thing?` const string
const optionalThing5: OptionalThing = { type: 'not literally "thing"' };

操场(配置为TypeScript)

我在将其转换为JSDoc时遇到了困难,因为TypeScript中的行为也是相同的。我试过这个:

代码语言:javascript
复制
/** @typedef {{ type: T; optional?: boolean; } | { type: `${T}?`; }} Type<T> */
/** @template {string} T */

/** @typedef {Type<'thing'>} ThingType */
// Error: Type 'Type' is not generic.

操场(配置为JavaScript)

我如何在JSDoc中创建一个通用JSDoc,以便在TypeScript检查JavaScript和JSDoc版本时,上述TypeScript逻辑的工作方式相同?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-04 15:50:38

您的代码几乎是正确的,您只需在相同的JSDoc注释中放置@template@typedef标记,如下所示:

代码语言:javascript
复制
/** 
 * @typedef {{ type: T; optional?: boolean; } | { type: `${T}?`; }} Type<T>
 * @template {string} T
 */

/**
 * @typedef {Type<'thing'>} ThingType
 */

操场连接

通常,当您需要定义一个泛型类型时,您将需要在这个@typedef标记旁边有一个@template标记,并在同一个JSDoc注释中添加一个JSDoc标记。

但是,您不能将ThingType typedef放在同一个JSDoc中,否则它也将成为一个泛型类型。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73237490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档