11

我一直在使用Visual Studio的JavaScript Intellisense functionality已经有一段时间了,它对提供标准API的建议有多么满意,但是我发现我无法获得Visual Studio理解配置对象(即具有多个可选或必需属性的单个对象作为函数的参数)。如何在Visual Studio中记录JavaScript配置对象Intellisense

official JSDoc syntax表明,如果一个参数,预计将有属性,您创建一个单独的@param线每使用点符号:

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

但是,Visual Studio不承认这一点 - 它呈现configconfig.nameconfig.gold作为三个独立的顶级参数。

do_it() registers three separate parameters

更糟的是,该方法体中自动完成功能不承认任何参数,更不用说它们的类型:

Attempting to access methods of config.name yields yellow triangles and no help.

出现的唯一的解决办法来,甚至接近Visual Studio将使用适当的文档(@constructor@property标签)编写从不称谓的构造函数,这使得我写了很多死代码,并且违背了JavaScript的无类别心态(这是我的原因首先配置对象)。它甚至不让我写配置对象!

不仅如此,但我也知道Visual Studio不需要它。例如,当我写出一个对this library function的调用时,它能够收集参数对象需要的属性,称为id,sourcetarget,并且在为函数的参数创建对象文本时提供了这些名称 - 而如果没有参数,则会提供这些名称单行文件。据推测,它来自一个简单的事实,他们是使用

Visual Studio autosuggests these three properties with no documentation comments at all

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

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

回答

6

您正在使用correct JSDoc syntax,但截至今天,Visual Studio并没有为具有命名属性的参数对象构建正确的IntelliSense。公司目前旗下有周围比你指的是一个本没有其它的办法,但你可以描述config对象的地方,避免你所说的这样写死代码:

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

} 

由于我们只使用这个对象文档和自动完成的目的,我们不需要实际编码。这并不比原始语法更冗长,并且具有记录配置对象的好处。

关于第二个问题,您可以看到sigma.js库的智能感知来源于解析函数代码本身的主体,而不是JSDoc注释。这就是为什么当你将缩小的“sigma.min.js”版本添加到你的项目中,仍然可以使用它的地方,评论已被删除。

可以测试一个类似于在该加法参数验证所述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.'; 
    ... 
} 

结果:

enter image description here

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

enter image description here

+1

文档部分不起作用 - 它不会显示为VS支持'@ typedef'。但是,我发现VS会使用虚构造器和typedef或第一次调用函数的参数来给出正确的类型。 – TheHansinator

+0

这是真的,它没有记录,但它的工作原理,你会得到正确的参数属性和它们的类型。如上所述,根本不需要虚拟构造函数,只是为了记录可能在函数本身之前发生的'config'对象。至于对函数的第一次调用,那是假定函数调用正在被VS传递的东西(像那个对象文字一样)解析。我想解释为什么你可以看到一些库的智能感知,因为你已经在使用JSDoc我个人会采用第一种方法.. – cviejo

+0

使用Visual Studio Community 2015版本14.0.23107.0进行测试,你使用的是什么版本? – cviejo

相关问题