Visual Studio - intellisense для пользовательского объекта javascript

Я создал следующий объект javascript:

var Content = Content || {};

// Constructor defines properties and inits object
Content.ProductManager = function () {
    // ...
};


Content.ProductManager.prototype = function () {

    // 
    // private members
    // 


    var setProductAsPreviewed = function (args) {
        // code omitted for brevity
        // ....
    };


    //
    // public members
    // 

    return {
        setProductAsPreviewed: setProductAsPreviewed
    };

} (); 

Объект, переданный в setProductAsPreviewed, имеет следующие свойства:

args = {
    productId: int,
    productName: string,
    updateDate: date,
    saveItems: bool
};

Я хочу включить комментарии XML, чтобы я мог получить intellisense для аргумента, переданного функции setProductAsPreviewed:

var productManager = new window.Content.ProductManager();
// show intellisense when typing the following:
productManager.setProductAsPreviewed( 

Этот поток показывает, как это сделать для простых args (string, int,...), но как это сделать для сложного объекта? Я использую Visual Studio 2010.

Ответ 1

Насколько я знаю, вы не можете сообщить IntelliSense, какие поля и методы относятся к общей переменной, если она используется как параметр.

Если переменная была массивом, вы можете определить ее следующим образом:

function funcWithArrayArg(arrayArg) {
    /// <param name="arrayArg" type="Array" elementType="Number">An array of numbers</param>
}

В VS2012 вы можете также аннотировать объекты так же (вы можете аннотировать поля о функциях, используемых в качестве конструкторов объектов, как показано ниже, но документы ничего не говорят об анонимных объектах, подобных этому):

var args = {
    /// <field type="Number">Product ID</field>
    productID: int
};

Ни один из этих подходов действительно не делает то, что вы хотите, поскольку второй подход не даст вам intellisense аргумента функции, и вы все равно используете VS2010.

Я считаю, что лучше всего определить пользовательский объект, который будет использоваться как объект аргумента только для этой функции, ведь так вы будете делать это на других языках, если хотите создать пользовательский объект в качестве параметра с IntelliSense. Это может выглядеть примерно так:

function ProductPreviewArgs(productId, productName, updateDate, saveItems) {
    /// <summary>Creates an object for use as the sole argument to the setProductAsPreviewed function</summary>
    /// <param name="productId" type="Number" optional="false">The Product ID</param>
    /// <param name="productName" type="String" optional="false">The Product Name</param>
    /// <param name="updateDate" type="Date" optional="false">The date the product was last updated</param>
    /// <param name="saveItems" type="Boolean" optional="false">Specifies whether or not to save the items</param>
    /// <returns type="ProductPreviewArgs">An object intended for use as the sole argument to the setProductAsPreviewed function</returns>
    /// <field name="productId" type="Number">The Product ID</field>
    /// <field name="productName" type="String">The Product Name</field>
    /// <field name="updateDate" type="Date">The date the product was last updated</field>
    /// <field name="saveItems" type="Boolean">Specifies whether or not to save the items</field>
    this.productId = productId;
    this.productName = productName;
    this.updateDate = updateDate;
    this.saveItems = saveItems;
}

Вы получите intellisense для объекта (который покажет, что вы положили в элемент returns):

setProductAsPreviewed(

Если вы затем решите создать новый объект, вы получите здесь IntelliSense (который покажет вам описания для каждого параметра один за другим при их добавлении):

setProductAsPreviewed(new ProductPreviewArgs(

Я не совсем уверен, будет ли атрибут type в элементе returns работать таким же образом, как это происходит в VS2012, и, как вы могли бы ожидать, до сих пор эти документы досадно относятся к этому вопросу; и у меня нет копии VS2010, чтобы проверить все это прямо сейчас.

Ответ 2

Вы можете создать отдельный файл IntelliSense, который выглядит примерно так:

intellisense.annotate(Content, {
  'setProductAsPreviewed ': function() {
    /// <signature>
    ///   <summary>Summary<summary>
    ///   <param name="args" type="ComplexObject">some text here
    /// </signature>
   }
})

Я считаю, что это должно работать с некоторой модификацией