JSDoc typedef 中的动态键

20

在jsdoc typedef中是否可以有动态键(属性名)?我想象这可能会看起来像下面的例子(但以下并不能工作)。

@typedef {Object} Foo
@property {string} bar
@property {*} *

传递未在类型定义中列出的属性 例如 {baz: 0} 会导致 TypeScript 报错,类似于:

类型“{ bar: string; baz: number; }”的参数不能赋给类型“Foo”的参数。 对象文字只能指定已知属性,并且“baz”不存在于类型“Foo”中


按照 @jcalz 提出的方法使用 Object.<string, *> 看起来更接近理想输出,但结果却非常奇怪

@typedef {Object} Foo
@property {number} bar
@property {Object.<string, *>}

输出:

type Foo = {
    bar: number;
    (Missing): {
        [x: string]: any;
    };
}

也许可以像这里提到的那样使用Object.<string,*>而不是 Object,详见此处 - jcalz
@jcalz,我没能让它工作。我已经将结果添加到帖子中。 - J'e
1
抱歉,我以前从未使用过JSDoc。我的建议是将第一行中的“Object”替换为“Object.<string, *>”,这样可以添加索引签名,但是当您添加“bar”时它会出错。我所见过的唯一有效的方法是 /**@typedef { {[k: string]: any, bar: string } } Foo */,但这基本上只是使用TypeScript类型语法而不是JSDoc。 - jcalz
1个回答

5
你可以在JSDOC中使用普通的TypeScript语法。
看下面的例子:
/**
 * 
 * @param {Record<string, string> & {bar:string}} arg
 */
const foo = (arg) => {}

您甚至可以使用实用程序类型:

/**
 * 
 * @param {Partial<{age:number}>} arg 
 */
const partial = (arg) => { }

您可以在这里找到更多的实用工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接