Visual StudioでASP.NET CoreにTypeScriptを追加する方法と2026年4月更新ポイント

Visual Studioで既存のASP.NET CoreアプリにTypeScriptを追加するなら、結論はシンプルです。Microsoft.TypeScript.MSBuildをNuGetで追加し、tsconfig.jsonでTypeScriptの入力元をscripts、出力先をwwwroot/jsに分け、Razor側で生成後のJavaScriptを読み込むのが基本です。

2026年4月のMicrosoft公式リポジトリ履歴では、4月24日にドキュメント管理系の更新が入り、その後4月27日にtsconfig.jsonとサンプルコードの実質的な見直しが確認できます。現場で重要なのは、「Visual Studio上でTypeScriptを少しだけASP.NET Core MVCに足す手順」が、より安全で整理された形になった点です。特にrootDirの追加と、DOM要素のnullチェックは、既存アプリへTypeScriptを段階導入するチームにとって見逃せません。(GitHub)

目次

Visual Studioの最新動向: Add TypeScript to an ASP.NET Core appで何が変わったか

Microsoft Learnの「Add TypeScript to an existing ASP.NET Core app in Visual Studio」は、ASP.NET Core MVCアプリにTypeScriptを追加し、ビルド、実行、デバッグ、サードパーティライブラリの型定義追加までを扱うチュートリアルです。前提として、Visual Studioと「ASP.NET と Web 開発」ワークロードが必要で、プロジェクト作成時は.NET 8.0 or laterを選ぶ流れになっています。(Microsoft Learn)

今回の2026年4月更新ポイントを実務目線で整理すると、単なる手順紹介ではなく、既存のASP.NET CoreアプリにTypeScriptを安全に組み込むための構成整理と見てよいでしょう。

更新・注目ポイント何が重要か現場で取るべき対応
Microsoft.TypeScript.MSBuildを使う流れが中心Visual Studio、MSBuild、dotnet build/dotnet publishとの相性がよいASP.NET Core MVCやRazor中心の既存アプリではNuGet導入を基本にする
tsconfig.jsonにrootDir: "./scripts"が入ったTypeScriptの入力元と生成JavaScriptの出力先を明確に分けられるscriptsに.ts、wwwroot/jsに生成物という構成を標準化する
wwwrootとnode_modulesをexclude生成済みJSや依存パッケージを再コンパイル対象にしないビルドの重複、意図しないファイル監視、出力ループを避ける
DOM要素取得後にnullチェックを入れるサンプルへ要素が存在しない場合の実行時エラーを避けられる本番コードではDOM取得後の存在確認を徹底する
Angular/Vue利用時はSPAテンプレート推奨MVCに小さくTypeScriptを足すケースと、本格SPAは別物フロントエンド規模に応じて導入方式を選ぶ

このチュートリアルが向いているケース、向いていないケース

Visual StudioでTypeScriptを扱う方法は複数あります。今回のMicrosoft Learn記事は、既存のASP.NET Core MVCアプリに、部分的にTypeScriptを追加するケースに向いています。

ケースおすすめ度判断基準
既存のASP.NET Core MVC/Razor Pagesアプリに少量の画面制御を追加したい高いフロントエンドは補助的で、サーバーサイドレンダリングが中心
dotnet buildやdotnet publishでTypeScriptも一緒にビルドしたい高いDevOpsやCI/CDでMSBuild統合を重視する
jQueryなど既存ライブラリに型定義を追加して保守性を上げたい高いレガシー寄りの画面を段階的に改善したい
React、Angular、Vueで本格的なSPAを作りたい低いSPAテンプレートやnpm/Viteなどのフロントエンドビルド基盤を使うべき
JavaScript Project Systemや.esprojベースのプロジェクト低いMicrosoftの別記事では、JSPSや.esprojではNuGetではなくnpmパッケージ利用が案内されている

Microsoft Learnでも、Visual Studio 2022以降でASP.NET CoreとAngularまたはVueを使う場合は、ASP.NET Core SPAテンプレートの利用が推奨されています。つまり、今回の手順は「SPA開発の標準手順」ではなく、ASP.NET Core MVCにTypeScriptを追加する軽量な導入手順として理解するのが正解です。(Microsoft Learn)

Visual StudioでASP.NET CoreアプリにTypeScriptを追加する基本手順

実務で迷わないように、Microsoft Learnの流れを現場向けに整理します。

前提条件を確認する

まず、Visual Studioに「ASP.NET と Web 開発」ワークロードが入っているか確認します。入っていない場合は、Visual Studio Installerから追加します。

ASP.NET Core MVCテンプレートが表示されない場合、原因の多くはこのワークロード不足です。テンプレート名や検索語を疑う前に、インストール済みワークロードを確認してください。

ASP.NET Core MVCプロジェクトを用意する

新規作成する場合は、Visual Studioの「新しいプロジェクトの作成」から、C#のASP.NET Core Web App (Model-View-Controller)を選びます。追加情報では.NET 8.0 or laterを選択する流れです。既存アプリに追加する場合も、MVCまたはRazorを中心にした構成であれば同じ考え方で導入できます。(Microsoft Learn)

TypeScriptサポート用のNuGetパッケージを追加する

プロジェクトを右クリックし、「NuGet パッケージの管理」からMicrosoft.TypeScript.MSBuildを検索してインストールします。

このパッケージを使う理由は、単にVisual StudioでTypeScriptを書けるようにするためだけではありません。ASP.NET Coreプロジェクトでは、TypeScriptのコンパイルを.NET Core CLIやMSBuildに統合しやすくなります。Microsoftの関連ドキュメントでも、Visual Studio 2019以降はTypeScript SDKではなくNuGetパッケージの利用が推奨され、.NETシナリオではdotnet buildやdotnet publishでTypeScriptコンパイルを有効にする方法として案内されています。(Microsoft Learn)

DevOpsエンジニアやPlatform Teamにとっては、ここが重要です。ローカルのVisual Studioだけで動く構成ではなく、CI/CDでも再現できる構成にしやすいからです。

2026年4月更新で注目すべきtsconfig.jsonの考え方

今回の更新で特に実務的なのが、tsconfig.jsonの構成です。ポイントは、入力元と出力先を分けることです。

{
  "compileOnSave": true,
  "compilerOptions": {
    "noImplicitAny": false,
    "noEmitOnError": true,
    "removeComments": false,
    "sourceMap": true,
    "target": "ES6",
    "rootDir": "./scripts",
    "outDir": "wwwroot/js"
  },
  "include": [
    "scripts/**/*"
  ],
  "exclude": [
    "node_modules",
    "wwwroot"
  ]
}

この構成では、TypeScriptファイルはscripts配下に置き、生成されたJavaScriptはwwwroot/jsへ出力されます。outDirは生成後のJavaScriptファイルの出力先を示し、sourceMapはデバッグに必要なソースマップ生成に関係します。Microsoft Learnでも、ビルド後にapp.jsとapp.js.mapが生成され、ソースマップはデバッグに必要と説明されています。(Microsoft Learn)

rootDirを指定する意味

rootDir: "./scripts"を指定すると、TypeScriptコンパイラがどこをソースの起点として扱うかが明確になります。

これを指定しない場合でも小さなサンプルでは動くことがありますが、ファイルが増えたときに出力構造が読みづらくなったり、どこまでをTypeScriptの入力として扱うべきかが曖昧になったりします。

実務では、次のように役割を分けると保守しやすくなります。

/scripts
  app.ts
  form-validation.ts
  dashboard.ts

/wwwroot/js
  app.js
  app.js.map
  form-validation.js
  form-validation.js.map
  dashboard.js
  dashboard.js.map

wwwroot/jsに.tsファイルを直接置かないことがポイントです。wwwrootはブラウザーへ配信する静的ファイルの場所です。TypeScriptのソースコード置き場ではなく、生成物の出力先として扱うと、開発者にもCIにも分かりやすい構成になります。

excludeでwwwrootを外す理由

excludeにwwwrootを入れるのは、生成されたJavaScriptやソースマップを再びTypeScriptコンパイル対象にしないためです。

特に、チーム開発で次のような問題が起きる場合は、includeとexcludeの設定を見直してください。

症状よくある原因対応
ビルド対象ファイルが増えすぎるincludeが広すぎるscripts/**/*のように入力元を限定する
生成物まで監視・処理されるwwwrootを除外していないexcludeにwwwrootを入れる
npm依存まで処理されるnode_modulesを除外していないexcludeにnode_modulesを入れる
出力先が分かりにくいoutDirだけで入力元が曖昧rootDirも指定する

DOM操作サンプルの改善: nullチェックは本番コードでも必須

2026年4月の差分では、app.tsのサンプルも改善されています。以前のようにdocument.getElementById()の戻り値へ直接アクセスするのではなく、取得した要素が存在するか確認してから処理する形です。GitHub上の差分でも、const element = document.getElementById("ts-example");で要素を受け取り、存在する場合のみinnerHTMLを更新するコードに変更されています。(GitHub)

実務では、さらに次のように書くと安全です。

function showGreeting(): void {
  const element = document.getElementById("ts-example");

  if (!element) {
    return;
  }

  element.textContent = "Hello from TypeScript";
}

ここでtextContentを使っているのは、単純な文字列表示ならinnerHTMLより安全だからです。innerHTMLはHTMLを挿入したい場合には便利ですが、外部入力やユーザー入力をそのまま入れるとXSSの原因になります。

判断基準は次の通りです。

目的使うプロパティ理由
文字列を表示するだけtextContentHTMLとして解釈されないため安全
HTML断片を意図的に描画するinnerHTMLタグを反映できるが、入力値の扱いに注意が必要
属性やクラスを操作するsetAttribute、classList目的が明確で保守しやすい

TypeScriptを入れるメリットは、型注釈やIntelliSenseだけではありません。こうしたDOM操作の危険な箇所を、コードレビューで発見しやすくなることも大きな利点です。

Razor側では生成後のJavaScriptを読み込む

TypeScriptファイルそのものをブラウザーで読み込むのではなく、コンパイル後のJavaScriptを読み込みます。

Microsoft Learnの流れでは、_Layout.cshtmlで次のようにwwwroot/js配下の生成物を参照します。(Microsoft Learn)

<script src="~/js/app.js"></script>

ここで注意したいのは、読み込み位置です。ページ固有の要素を操作するスクリプトを共通レイアウトで読み込む場合、その要素が存在しないページでもスクリプトが実行される可能性があります。

そのため、本番では次のいずれかを選びます。

方法向いているケース注意点
_Layout.cshtmlで共通読み込み全ページで使う共通スクリプトページ固有要素に直接依存しない
各ViewのScriptsセクションで読み込み特定ページだけで使うスクリプト読み忘れを防ぐルールが必要
バンドル・ビルドツールでまとめるファイル数が多いnpm/Vite/Webpackなどの運用が必要

小規模な導入なら_Layout.cshtmlで十分です。ただし、画面ごとにTypeScriptファイルが増えるなら、ページ単位で読み込むか、フロントエンドのビルド基盤を別途検討した方が管理しやすくなります。

ビルドとデバッグで確認すべきポイント

Visual Studioではアプリ実行時にビルドされますが、導入直後は必ず「Build > Build Solution」を実行して、TypeScriptの出力を確認しましょう。

確認すべきファイルは次の2つです。

wwwroot/js/app.js
wwwroot/js/app.js.map

app.jsはブラウザーが実行するJavaScriptです。app.js.mapはTypeScriptソースと生成後JavaScriptを対応付けるソースマップで、デバッグに使われます。Microsoft Learnでも、TypeScriptコンパイラがこれらを生成し、ソースマップはデバッグに必要と説明されています。(Microsoft Learn)

ChromeまたはEdgeでクライアント側スクリプトをデバッグする

Visual StudioからF5で実行し、TypeScript側の関数にブレークポイントを設定すると、ブラウザー操作をきっかけにブレークできます。Microsoft Learnでは、クライアント側スクリプトのデバッグにはChromeまたはEdgeが必要とされています。(Microsoft Learn)

デバッグできない場合は、次の順に確認してください。

確認項目見る場所対応
.mapファイルが生成されているかwwwroot/jssourceMap: trueを確認する
読み込んでいるJSパスが正しいかブラウザーの開発者ツール404になっていないか確認する
ブレークポイントがバインドされているかVisual Studio空洞の赤丸になっていないか見る
ブラウザーが対応しているか実行ブラウザーChromeまたはEdgeで試す
古いJSがキャッシュされていないかDevTools Networkキャッシュ無効化またはハードリロードする

サードパーティライブラリを使う場合は型定義を入れる

チュートリアルでは、jQueryの型定義として@types/jqueryを追加する例も紹介されています。型定義を入れると、jQueryオブジェクトに対してIntelliSenseが効き、メソッド名の補完や型チェックの恩恵を受けられます。(Microsoft Learn)

例として、package.jsonに次のようなdevDependenciesを追加します。

{
  "devDependencies": {
    "@types/jquery": "3.5.1"
  }
}

ただし、ここで混同しやすい点があります。@types/jqueryは、jQuery本体ではなくTypeScript向けの型定義です。MVCテンプレートではjQuery本体がwwwroot/libに含まれる場合がありますが、別のテンプレートや独自構成では、jQuery本体も別途追加する必要があります。

パッケージ役割本番で必要か
jqueryブラウザーで動くライブラリ本体使うなら必要
@types/jqueryTypeScriptの補完・型チェック用開発時に必要
Microsoft.TypeScript.MSBuildTypeScriptをMSBuildで扱うためのNuGetビルド構成として必要

既存のレガシー画面でjQueryを使っているチームにとって、@types/*の導入は移行の第一歩として有効です。いきなりReactやVueへ置き換えるより、まず型定義を入れて誤用を減らす方が、短期的には効果が出やすい場合があります。

DevOps・Platform Team向け: CI/CDで失敗しない設計ポイント

Visual Studio上で動いたとしても、CI/CDで失敗する構成では実務投入しにくくなります。TypeScript導入時は、ローカル開発者だけでなく、ビルドサーバーやリリースパイプラインも含めて設計しましょう。

dotnet buildでTypeScriptも通るか確認する

NuGetのMicrosoft.TypeScript.MSBuildを使う利点は、MSBuildや.NET Core CLIとの統合です。Microsoftの関連ドキュメントでも、ASP.NET CoreプロジェクトではNuGetパッケージが.NETシナリオの推奨オプションであり、dotnet buildやdotnet publishでTypeScriptコンパイルを有効にする方法として説明されています。(Microsoft Learn)

CIで最低限確認したいコマンドは次の通りです。

dotnet restore
dotnet build --configuration Release
dotnet publish --configuration Release

ビルドサーバーでだけ失敗する場合は、Node.jsやVisual Studio Build Tools、NuGetパッケージ復元、作業ディレクトリの差異を確認します。

生成JSをGit管理するか決める

wwwroot/jsに生成される.jsや.js.mapをGitに含めるかは、チームの運用で決める必要があります。

方針メリットデメリット向いているケース
生成JSをコミットするデプロイ時にビルド不要でも動く差分が増え、ソースと生成物のズレが起きやすいシンプルな手動デプロイ
生成JSをコミットしないソース管理がきれいCI/CDで必ずビルドが必要自動ビルド・自動デプロイ
本番では.mapを出さないソース漏えいリスクを下げられる本番デバッグがしにくいセキュリティ要件が強い環境

おすすめは、CI/CDが整っているならTypeScriptソースを正とし、生成物はビルドで作る方針です。ただし、静的ファイルだけを単純コピーする運用が残っている場合は、生成JSの扱いを事前に決めておかないと、本番でスクリプトが見つからない事故につながります。

Source Mapの公開範囲を考える

sourceMap: trueは開発とデバッグには便利です。一方で、本番環境に.mapファイルを公開すると、TypeScriptの元コード構造が見えやすくなります。

機密ロジックをフロントエンドに置くべきではありませんが、それでも社内用画面や管理画面では、ソースマップの公開範囲を確認してください。

実務では次のように分けると安全です。

環境sourceMap理由
ローカル開発trueVisual Studioでのデバッグに必要
検証環境trueまたは制限付き障害調査を優先する場合に有効
本番環境要件次第公開リスクと調査効率のバランスで判断

よくある失敗と対処法

TypeScriptファイルをwwwrootに置いてしまう

wwwrootは公開される静的ファイルの置き場です。TypeScriptのソースを置く場所ではありません。

誤ってwwwroot/js/app.tsのように配置すると、出力先と入力元が混ざり、チーム内で「どれが編集対象か」が分かりにくくなります。基本はscriptsに.ts、wwwroot/jsに生成された.jsです。

生成されたJSではなくTSをRazorから読もうとする

ブラウザーが実行するのはTypeScriptではなくJavaScriptです。RazorやHTMLからは、生成後の~/js/app.jsを読み込みます。

<script src="~/js/app.js"></script>

~/scripts/app.tsのように参照しても、通常のブラウザーではそのまま実行できません。

DOM要素が存在しないページでエラーになる

共通レイアウトでスクリプトを読み込むと、全ページで同じJavaScriptが実行されます。特定ページにしか存在しない要素を操作するなら、必ず存在確認を入れます。

const button = document.getElementById("save-button");

if (!button) {
  return;
}

このチェックは、TypeScript初心者ほど省略しがちです。最初からチームのコーディング規約に入れておくと、レビューコストを下げられます。

npmパッケージの状態がVisual Studio上で同期しない

Microsoft Learnでは、package.jsonとソリューションエクスプローラー上のnpmパッケージ表示が同期していないように見えるケースにも触れています。多くの場合、Visual Studioの再起動やpackage.jsonの再追加で表示が更新されることがあります。(Microsoft Learn)

CIではVisual Studioの表示ではなく、実際にnpm installやdotnet buildが成功するかを基準に判断しましょう。

既存ASP.NET CoreアプリにTypeScriptを入れる判断基準

TypeScript導入は「流行っているから入れる」ではなく、次の条件に当てはまるときに効果が出やすいです。

導入した方がよい状況理由
JavaScriptの画面ロジックが増えてきた型チェックと補完で保守しやすくなる
複数人で同じJSを編集している引数や戻り値の誤解を減らせる
jQueryや既存ライブラリの誤用が多い@types/*で補完と型チェックを使える
CI/CDでビルドを標準化したいNuGet/MSBuild統合で再現性を高めやすい
将来的にフロントエンド刷新を考えている段階的移行の準備になる

一方で、すでにReactやVueを本格採用している場合、ASP.NET Core MVCに直接TypeScriptを足すより、専用のフロントエンドプロジェクトやSPAテンプレートを使った方が自然です。

実務でのおすすめ構成

小〜中規模のASP.NET Core MVCアプリなら、次の構成が扱いやすいです。

/MyAspNetCoreApp
  /Controllers
  /Models
  /Views
  /scripts
    app.ts
    validation.ts
  /wwwroot
    /js
      app.js
      app.js.map
      validation.js
      validation.js.map
    /css
    /lib
  tsconfig.json
  package.json
  MyAspNetCoreApp.csproj

この構成のメリットは、役割が明確なことです。

scriptsは開発者が編集するTypeScriptの置き場です。wwwroot/jsはブラウザーに配信するJavaScriptの置き場です。tsconfig.jsonはその変換ルールを管理します。

Platform Teamが社内テンプレートを整備するなら、このディレクトリ構成とtsconfig.jsonを標準化しておくと、チームごとの差異を減らせます。

まとめ: 2026年4月更新で押さえるべき次の一手

Visual Studioの「Add TypeScript to an ASP.NET Core app」は、既存のASP.NET Core MVCアプリにTypeScriptを段階導入するための実用的な手順です。2026年4月の公式リポジトリ履歴を見ると、4月24日の管理系更新に加え、4月27日にtsconfig.jsonとサンプルコードの改善が入っており、実務では次の3点を押さえるべきです。(GitHub)

まず、TypeScriptサポートはMicrosoft.TypeScript.MSBuildで追加し、Visual Studioだけでなくdotnet buildやdotnet publishでも再現できる構成にします。次に、rootDir: "./scripts"とoutDir: "wwwroot/js"で、ソースと生成物を明確に分けます。最後に、DOM操作ではgetElementById()の戻り値を必ず確認し、ページによって要素が存在しないケースでも壊れないコードにします。

次に取るべき行動は、既存プロジェクトでscriptsとwwwroot/jsの分離ができているか、tsconfig.jsonにrootDirとexcludeが入っているか、CIでdotnet buildが通るかを確認することです。ここまで整えれば、ASP.NET CoreアプリへTypeScriptを安全に追加し、チーム開発でも保守しやすい構成にできます。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次