Использование Web Essentials 2013 для создания файла intellisense машинописного текста не работает

У меня установлена ​​Visual Studio 2013 с Web Essentials 2013. Я щелкаю правой кнопкой мыши файл .cs и выбираю «Web Essentials -> Создать файл intellisense Typescript», чтобы получить файл typescript d.ts, на который я могу ссылаться в машинописном коде. . Я столкнулся с несколькими проблемами с этим. Скажем, мой класс выглядит следующим образом:

namespace SomeNamespace
{
    [TypescriptModule("test")]

    [DataContract(Name = "MyDTO")]
    public partial class MyPM
    {
        [DataMember(Name = "id")]
        public long Id { get; set; }

        [Required]
        [DataMember(Name = "name")]
        public CustomPM Data{ get; set; }
    }
}

Файл d.ts, который я получаю:

declare module test {
    interface MyPM{
        id: number;
        data: test.CustomPM;
    }
}

Первая проблема заключается в том, что строка:

[DataContract(Name = "MyDTO")]

игнорируется при генерации. Он генерирует не класс с именем MyDTO, а класс с именем MyPM, хотя MyDTO — это строка, указанная для использования во время сериализации, и именно она передается клиенту по сети. Я провел некоторое расследование и код здесь:

https://github.com/madskristensen/WebEssentials2013/blob/master/EditorExtensions/Commands/Code/IntellisenseParser.cs#L207

указывает, что он использует свойство CodeClass.Name для определения имени класса. Есть ли способ использовать атрибуты класса (что-то помимо имени DataContract), чтобы свойство CodeClass.Name содержало другую строку, помимо фактического имени класса?

Вторая проблема заключается в этой строке:

data: test.CustomPM;

В Visual Studio 2013 с установленным typescript test.CustomPM выдает мне ошибку, потому что не может найти тип CustomPM в тестовом модуле, даже если класс был сгенерирован в том же «тестовом» модуле и доступен для использования. Отсутствует часть этой строки в верхней части файла d.ts:

/// <reference path="./CustomPM.cs.d.ts"/>

Однако я не смог найти способ, чтобы генератор также генерировал это.

Я был бы очень признателен, если бы кто-нибудь мог пролить свет на способы решения этих проблем. Спасибо!


person Michelle    schedule 21.02.2014    source источник


Ответы (2)


Это старый вопрос, и я не буду отвечать прямо, потому что не знал об этой функциональности WebEssentials.

Но я дам вам альтернативу, которая работает очень хорошо:

TypeLite — http://type.litesolutions.net/

Вам просто нужно поместить атрибут [TsClass] в классы, которые вы хотите.

Если вы хотите, чтобы ваш интерфейс TS начинался с I и всех свойств camelCase, отредактируйте TypeLite.Net4.tt:

 var ts = TypeScript.Definitions()
        .WithReference("Enums.ts")
        .ForLoadedAssemblies()
        .WithFormatter((type, f) => "I" + ((TypeLite.TsModels.TsClass)type).Name) 
        .WithMemberFormatter((TypeLite.TsModels.TsProperty identifier) => Char.ToLower(identifier.Name[0]) + identifier.Name.Substring(1)); 
person antoinestv    schedule 30.06.2015

Вы можете ссылаться на свои сгенерированные типы в своей базе tsconfig.json, тогда вам не нужна пользовательская ссылка в каждом файле машинописного текста:

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es6",
    "jsx": "preserve"
  },
  "files": [
    "../typings/index.d.ts",
    "./TestForm.tsx",
    "./declaration.d.ts",
    "../models/models.cs.d.ts"
  ]
}
person Community    schedule 29.09.2016