Использование TypeScript с встроенным серверным блоком `<script>` и ASP.Net

Я хочу иметь встроенный TypeScript на странице ASPX (или Razor), которая преобразуется в Javascript при компиляции страницы.

Итак:

<script type="text/typescript" runat="server">
    ...
</script>

становится...

<script type="text/javascript">
    ...
</script>

Это должно произойти в той же точке, в которой преобразуются блоки @ или <% %>.

Это должно быть возможно во время выполнения с какой-либо пост-обработкой страницы, но это не будет генерировать исключения во время компиляции - я хочу найти ошибки в script одновременно с любым кодом С#.

В идеале TypeScript intellisense и тому подобное должны работать в встроенном блоке <script>, что заставляет меня думать, что это должно быть расширение VS2012.

Есть ли способ сделать это?

Ответ 1

Короткий ответ - нет.

Вы можете написать файл TypeScript и вставить скомпилированный JavaScript, но так близко, как вы получите. Одна из практических проблем заключалась бы в том, что если компилятор преобразовал ваш TypeScript в JavaScript, вы потеряете код TypeScript. Вот почему у вас есть файл TypeScript и файл JavaScript.

Какова веская причина поместить встроенную строку script вместо ссылки на внешний script - может быть, есть другое решение вашей проблемы, которое не требует встроенных скриптов?

Ответ 2

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

[DefaultProperty("Text")]  
[ToolboxData("<{0}:TypeScript runat=server></{0}:TypeScript>")]  
public class TypeScript : WebControl  
{  
    public string Text { get; set; }

    protected override void RenderContents(HtmlTextWriter output)  
    {  
        output.AddAttribute(HtmlTextWriterAttribute.Type, "text/javascript");  
        if (!string.IsNullOrEmpty(this.ID))
        {
            output.AddAttribute(HtmlTextWriterAttribute.Id, this.ID);  
        }
        output.RenderBeginTag("script");
        output.Write(CompileToJavaScript(Text));
        output.RenderEndTag();
    }

    private string CompileToJavaScript(string typeScript)
    {
        // TODO: Call tsc with the code, and return the result.
    }
} 

Возможно, вы сможете скомпилировать tsc.js с JScript.NET, если вы хотите внедрить IO-слой, и отсеите некоторые синтаксические ошибки JScript.Net(а не JavaScript).

Ответ 3

  • есть для этого работа, то, что я делаю, объявляет переменные, необходимые из бритвы в теге script

    <script type="text/javascript">
    
    //Razor variables initialized here and declared in the TypescriptFile.ts file
    
    var url = "@Url.Action("NewRequest", "Request")";
    
    </script>
    
  • next объявить переменную url в файле Typescript

    //TypescriptFile.ts
    declare var url: string;
    alert(url);
    
  • используйте его

  • чтобы увидеть, что Visual Studio 2013 по-прежнему не поддерживает серверную поддержку.

Ответ 4

Хотя это не реальное решение вашей проблемы, но почему бы вам не оставить свой код TypeScript как есть в <script type="text/typescript"> и использовать Typescript Компилировать, чтобы он был скомпилирован во время выполнения?