Node.js 如何让Visual Studio Typescript 1.7 intellisense与nodejs库(angular2,rxjs)一起工作?

Node.js 如何让Visual Studio Typescript 1.7 intellisense与nodejs库(angular2,rxjs)一起工作?,node.js,typescript,visual-studio-2015,angular,intellisense,Node.js,Typescript,Visual Studio 2015,Angular,Intellisense,[已解决] 我记录了一个补丁,这个补丁应该会在下一个VS插件版本中发布。基本上,如果您将模块分辨率指定为“NodeJs”,则可以让intellisense工作。但是编译器不喜欢这样,因为它希望它是“节点”。看起来他们正在做的修复是通过指定“Node”使一切工作正常 我正在尝试使用msbuild构建Angular2项目,因为我想使用ASP.NETWebAPI作为后端。代码编译和运行良好,但我的编辑器(SublimiteText 3或Visual Studio 2015)不喜欢我导入Angular

[已解决] 我记录了一个补丁,这个补丁应该会在下一个VS插件版本中发布。基本上,如果您将模块分辨率指定为“NodeJs”,则可以让intellisense工作。但是编译器不喜欢这样,因为它希望它是“节点”。看起来他们正在做的修复是通过指定“Node”使一切工作正常


我正在尝试使用msbuild构建Angular2项目,因为我想使用ASP.NETWebAPI作为后端。代码编译和运行良好,但我的编辑器(SublimiteText 3或Visual Studio 2015)不喜欢我导入Angular2库的方式:

boot.ts:

import {bootstrap} from 'angular2/platform/browser';  // error: cannot find module
import {AppComponent} from './app.component';
bootstrap(AppComponent, []);
如果我使用TypeScript编译器直接使用tsconfig.json和node lite服务器运行相同的示例(),那么SublimiteText3可以正常工作,并且可以识别这种语法。然而,一旦我切换到msbuild,出于某种原因,我就会出现这个intellisense错误。以下是我的项目中我认为相关的其他部分:

文件夹结构:

\
  - index.html
  - package.json
  \app
      - boot.ts
      - app.component.ts
  \node_modules
      \angular2
          \platform
              - browser.js
              - browser.d.ts
package.json:

{
  "name": "angular2-webapi",
  "version": "1.0.0",
  "scripts": {
  },
  "license": "ISC",
  "dependencies": {
    "angular2": "2.0.0-beta.0",
    "systemjs": "0.19.6",
    "es6-promise": "^3.0.2",
    "es6-shim": "^0.33.3",
    "reflect-metadata": "0.1.2",
    "rxjs": "5.0.0-beta.0",
    "zone.js": "0.5.10"
  },
  "devDependencies": {
    "typescript": "^1.7.3" 
  }
}
csproj文件中的TypeScript编译器部分(大部分是从tsconfig文件复制的,但其中一些是由VS自动设置的):


实际上,我不确定系统应该如何知道如何解析“angular2/platform/browser”语法,但如果不使用msbuild,它似乎可以工作。考虑到这段代码能够正确编译和运行,它似乎也应该在我的编辑器中工作。有人有什么想法吗?

只要项目属性组设置为

<TypeScriptModuleResolution>NodeJs</TypeScriptModuleResolution>
NodeJs
有一种解决方法是修改Microsoft.Typescript.targets。 它使编译器能够工作:

<TypeScriptBuildConfigurations Condition="'$(TypeScriptModuleResolution)' != ''">$(TypeScriptBuildConfigurations) --moduleResolution $(TypeScriptModuleResolution)</TypeScriptBuildConfigurations>
$(TypeScriptBuildConfiguration)--moduleResolution$(TypeScriptModuleResolution)
硬编码为

<TypeScriptBuildConfigurations Condition="'$(TypeScriptModuleResolution)' != '' and '$(TypeScriptModuleResolution)' != 'NodeJs'">$(TypeScriptBuildConfigurations) --moduleResolution $(TypeScriptModuleResolution)</TypeScriptBuildConfigurations>
<TypeScriptBuildConfigurations Condition="'$(TypeScriptModuleResolution)' == 'NodeJs'">$(TypeScriptBuildConfigurations) --moduleResolution node</TypeScriptBuildConfigurations>
$(TypeScriptBuildConfiguration)--moduleResolution$(TypeScriptModuleResolution)
$(TypeScriptBuildConfiguration)--模块解决方案节点

PS确保备份Microsoft.Typescript.targets

正如@AndrewSorokin所描述的,这似乎是Typescript工具中的一个错误,但是您可以覆盖项目文件中的错误代码,而不是编辑
Microsoft.Typescript.targets
。将以下行添加到项目文件的末尾:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- ... -->
  <!-- Set the Module Resolution mode to be NodeJs as required by intellisense -->
  <!-- See http://stackoverflow.com/questions/34939261/how-can-i-get-visual-studio-typescript-1-7-intellisense-to-work-with-nodejs-libr -->
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
    <TypeScriptModuleResolution>NodeJs</TypeScriptModuleResolution>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
    <TypeScriptModuleResolution>NodeJs</TypeScriptModuleResolution>
  </PropertyGroup>
  <!-- ... -->
  <!-- Override the moduleResolution parameter to tsc to overcome a bug in intellisense -->
  <!-- See http://stackoverflow.com/questions/34939261/how-can-i-get-visual-studio-typescript-1-7-intellisense-to-work-with-nodejs-libr -->
  <PropertyGroup>
    <CompileTypeScriptDependsOn>
      SpoofTypeScriptModuleResolution;
      $(CompileTypeScriptDependsOn)
    </CompileTypeScriptDependsOn>
  </PropertyGroup>
  <Target Name="SpoofTypeScriptModuleResolution">
    <PropertyGroup>
      <TypeScriptBuildConfigurations>$(TypeScriptBuildConfigurations.Replace('--moduleResolution NodeJs', '--moduleResolution node'))</TypeScriptBuildConfigurations>
    </PropertyGroup>
    <Message Text="Options: $(TypeScriptBuildConfigurations)" />
  </Target>
</Project>

NodeJs
NodeJs
SpoofTypeScriptModuleResolution;
$(CompileTypeScriptDependsOn)
$(TypeScriptBuildConfigurations.Replace('--moduleResolution节点','--moduleResolution节点'))

Webstorm EAP是开箱即用的,它是免费的,因为它是预发布版本->谢谢。我实际上只使用VisualStudio,因为我希望能够在本地调试我的ASP.NETWebAPI项目。我还想指出,这似乎是特定于生成的,而不是特定于编辑器的,因为我在SublimiteText中遇到了这个问题,如果我不使用msbuild,它通常会工作。我已经更新了问题以反映这些信息。谢谢安德鲁。看起来这可能是一个短期解决方案,但我不认为我会使用它,因为它需要修改一个全局目标文件。因为我要将此发布到托管服务,所以我将无法访问该文件。现在,我可能只需要将Sublime与Tconfig文件一起使用,然后等待VS的TS插件的更新。不过,我感谢您的帮助。
<TypeScriptBuildConfigurations Condition="'$(TypeScriptModuleResolution)' != '' and '$(TypeScriptModuleResolution)' != 'NodeJs'">$(TypeScriptBuildConfigurations) --moduleResolution $(TypeScriptModuleResolution)</TypeScriptBuildConfigurations>
<TypeScriptBuildConfigurations Condition="'$(TypeScriptModuleResolution)' == 'NodeJs'">$(TypeScriptBuildConfigurations) --moduleResolution node</TypeScriptBuildConfigurations>
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- ... -->
  <!-- Set the Module Resolution mode to be NodeJs as required by intellisense -->
  <!-- See http://stackoverflow.com/questions/34939261/how-can-i-get-visual-studio-typescript-1-7-intellisense-to-work-with-nodejs-libr -->
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
    <TypeScriptModuleResolution>NodeJs</TypeScriptModuleResolution>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
    <TypeScriptModuleResolution>NodeJs</TypeScriptModuleResolution>
  </PropertyGroup>
  <!-- ... -->
  <!-- Override the moduleResolution parameter to tsc to overcome a bug in intellisense -->
  <!-- See http://stackoverflow.com/questions/34939261/how-can-i-get-visual-studio-typescript-1-7-intellisense-to-work-with-nodejs-libr -->
  <PropertyGroup>
    <CompileTypeScriptDependsOn>
      SpoofTypeScriptModuleResolution;
      $(CompileTypeScriptDependsOn)
    </CompileTypeScriptDependsOn>
  </PropertyGroup>
  <Target Name="SpoofTypeScriptModuleResolution">
    <PropertyGroup>
      <TypeScriptBuildConfigurations>$(TypeScriptBuildConfigurations.Replace('--moduleResolution NodeJs', '--moduleResolution node'))</TypeScriptBuildConfigurations>
    </PropertyGroup>
    <Message Text="Options: $(TypeScriptBuildConfigurations)" />
  </Target>
</Project>