我在一个使用JSDoc编译器检查的JavaScript项目中使用TypeScript。
在TypeScript中,我可以创建如下所示的泛型类型:
type Optional<TType extends string> = { type: TType; optional?: boolean; } | { type: `${TType}?` };
type OptionalThing = Optional<'thing'>;OptionalThing的解析和扁平值现在如下:
type OptionalThing =
| { type: 'thing'; optional?: boolean; }
| { type: 'thing?'; }此类型创建一个类型联合,其中一个成员类型具有type字段的文字和const type值,它有一个额外的optional布尔字段,而另一个成员类型具有type字段的文字和const thing?,而没有optional字段。
?后缀在type上是一种简短的语法,用于在我解决的问题中标记为可选的东西,因此除了需要禁止指定optional之外,还需要禁止指定optional,否则就有可能表示无效的值:{ type: 'thing?', optional: false }。
换言之:
/* 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"' };我在将其转换为JSDoc时遇到了困难,因为TypeScript中的行为也是相同的。我试过这个:
/** @typedef {{ type: T; optional?: boolean; } | { type: `${T}?`; }} Type<T> */
/** @template {string} T */
/** @typedef {Type<'thing'>} ThingType */
// Error: Type 'Type' is not generic.我如何在JSDoc中创建一个通用JSDoc,以便在TypeScript检查JavaScript和JSDoc版本时,上述TypeScript逻辑的工作方式相同?
发布于 2022-08-04 15:50:38
您的代码几乎是正确的,您只需在相同的JSDoc注释中放置@template和@typedef标记,如下所示:
/**
* @typedef {{ type: T; optional?: boolean; } | { type: `${T}?`; }} Type<T>
* @template {string} T
*/
/**
* @typedef {Type<'thing'>} ThingType
*/通常,当您需要定义一个泛型类型时,您将需要在这个@typedef标记旁边有一个@template标记,并在同一个JSDoc注释中添加一个JSDoc标记。
但是,您不能将ThingType typedef放在同一个JSDoc中,否则它也将成为一个泛型类型。
https://stackoverflow.com/questions/73237490
复制相似问题