在 Visual Studio 中为 TypeScript 拖放 ES6 导入

Drag-and-drop ES6 imports in Visual Studio for TypeScript

目前在 Web-Essentials 中(针对 Visual Studio 2015),如果将解决方案资源管理器中的 .ts 文件拖放到打开的 .ts 文件中,参考路径为自动插入顶部:

/// <reference path="../playback/key.ts" />

当使用内部模块(命名空间)开发项目时这很好,但在外部时几乎没用。我怎样才能生成 ES6 import statement 呢?那将是真棒。如:

import {} from "../playback/key";

原来我们看到的是 Web-Essentials 的内置功能。我已经提交了 feature-request 以获得此功能,希望在不久的将来。


同时,以下 Visual Commander 自动化片段可以替换对 ES6 导入的所有引用:

using EnvDTE;
using EnvDTE80;
using System.Text.RegularExpressions;

public class C : VisualCommanderExt.ICommand
{
    // Called by Visual Commander extension.
    public void Run(EnvDTE80.DTE2 DTE, Microsoft.VisualStudio.Shell.Package package) 
    {
        TextDocument doc = (TextDocument)(DTE.ActiveDocument.Object("TextDocument"));
        var p = doc.StartPoint.CreateEditPoint();
        string s = p.GetText(doc.EndPoint);

        p.ReplaceText(doc.EndPoint, this.ReplaceReferences(s), (int)vsEPReplaceTextOptions.vsEPReplaceTextKeepMarkers);
    }

    // Converts "reference" syntax to "ES6 import" syntax.
    private string ReplaceReferences(string text)
    {
        string pattern = "\/\/\/ *<reference *path *= *\"([^\"]*)(?:\.ts)\" *\/>";

        var regex = new Regex(pattern);
        var matches = Regex.Matches(text, pattern);

        return Regex.Replace(text, pattern, "import {} from \"./\";");
    }
}

用于执行此替换的正则表达式是(没有双反斜杠,更具可读性):

\/\/\/ *<reference *path *= *"([^"]*)(?:\.ts)" *\/>

此代码段将有效地将当前活动文档中的所有参考注释转换为 ES6 导入,非常有用。


已知问题:

  • 如果包含 reference 标签的评论前面有相应行中的其他文本,则 Visual Studio 无法识别该评论,但它仍会被此代码段替换
  • reference 标记后的附加文本有效,但替换后会导致语法错误,因为它不再是注释。

(如果在拖放 .ts 文件时在 Web-Essentials 生成的参考标签上使用代码段,则这些问题都不相关。)