【问题标题】:How to document JavaScript configuration objects in Visual Studio Intellisense如何在 Visual Studio Intellisense 中记录 JavaScript 配置对象
【发布时间】:2016-03-20 11:40:17
【问题描述】:

我已经使用 Visual Studio 的 JavaScript Intellisense functionality 有一段时间了,对它为标准 API 提供建议的能力非常满意,但我发现我无法让 Visual Studio 理解配置对象(即单个具有多个可选或必需属性作为函数参数的对象)。

official JSDoc syntax 建议如果一个参数应该有属性,你可以为每个参数创建一个单独的@param 行并使用点表示法:

/**
 * @param {Object} config
 * @param {String} config.name
 * @param {Number} config.gold
 */
function do_it(config) { ... }

但是,Visual Studio 无法识别这一点 - 它将 configconfig.nameconfig.gold 呈现为三个单独的顶级参数。

更糟糕的是,方法主体中的 AutoComplete 功能也无法识别参数,更不用说它们的类型了:

在 Visual Studio 中似乎更接近的唯一解决方案是编写带有适当文档(@constructor@property 标记)的从未调用的构造函数,这使我编写了很多死代码,也违背了JavaScript 的无类心态(这是我首先使用配置对象的原因)。它甚至不让我写配置对象!

不仅如此,我还知道 Visual Studio 不需要它。例如,当我写出对this library function 的调用时,它能够收集到参数对象需要名为idsourcetarget 的属性,并在我为函数的参数 - 没有一行文档。大概是因为它们被使用这样一个简单的事实:

当然,如果这些属性不在对象上且类型不正确,该方法确实会抛出异常,但仍然如此。 编辑:我最近能够在我自己的代码中使用对象字面量参数来复制效果——我用一个定义明确的对象调用了一个函数,当我调用该函数时它给了我 Intellisense 建议再次在我的代码中的其他地方。但我仍然没有函数体内的类型信息或语义访问。

Visual Studio 显然理解配置对象的概念,并且正在做一些逻辑来提供建议的属性。那个算法是什么?以及如何在不破坏代码的情况下利用它?

【问题讨论】:

    标签: javascript documentation visual-studio-2015 jsdoc javascript-intellisense


    【解决方案1】:

    您正在使用correct JSDoc syntax,但截至今天,Visual Studio 还没有为具有命名属性的参数对象构建正确的 IntelliSense。除了您提到的那个之外,目前没有其他方法可以解决这个问题,但是您可以在适当的位置描述 config 对象并避免编写您提到的死代码:

    /**
     * @typedef  {object} TestConfig
     * @property {string} name
     * @property {number} gold
     *//**
     * @param    {TestConfig} config 
     */
    function test(config) {
    
    }
    

    由于我们仅将此对象用于文档和自动完成目的,我们不需要实际编写代码。这并不比原始语法更冗长,而且还具有将配置对象记录在案的好处。

    关于您的第二个问题,您可以看到 sigma.js 库的 IntelliSense 源自解析函数代码本身的主体,而不是 JSDoc cmets。这就是为什么当您将缩小的“sigma.min.js”构建添加到您的项目时仍然可以使用它,其中 cmets 已被剥离。

    您可以测试类似于library function 中的这种添加参数验证(尽管以任何其他方式访问config.nameconfig.gold 也会产生相同的结果):

    function do_it(config) {
        if (Object(config) !== config || arguments.length !== 1) throw 'do_it: wrong arguments.';
        if (typeof config.name !== 'string') throw 'config must have a name string field.';
        if (typeof config.gold !== 'number') throw 'config must have a gold number field.';
        ...
    }
    

    结果:

    以类似的方式,一旦您提供了足够的信息,就会推断出正确的类型:

    【讨论】:

    • 文档部分不起作用 - 似乎 VS 不支持 @typedef。但是,我发现 VS 会使用虚拟构造函数和 typedef,或者使用第一次调用函数的参数来提供正确的类型。
    • 没错,它没有记录在案,但它有效,您将获得正确的参数属性及其类型。如上所述,您根本不需要虚拟构造函数,只需记录可能在函数本身之前发生的“配置”对象。至于对函数的第一次调用,这是假设函数调用正在传递一些可被 VS 解析的东西(比如那个对象文字)。我只是想解释为什么您可以在某些库中看到 IntelliSense,因为您已经在使用 JSDoc 我个人会采用第一种方法..
    • 用 Visual Studio Community 2015 版本 14.0.23107.0 测试,你用的是什么版本?
    • 与 2015 企业版 14.0.24720.00 更新 1
    • 抱歉,@typedef 确实有效。 “第一次调用”行为会覆盖您在尝试在函数体内获取 Intellisense 时提供的任何文档。
    猜你喜欢
    • 2013-02-09
    • 1970-01-01
    • 2017-01-27
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2016-10-31
    • 1970-01-01
    相关资源
    最近更新 更多