首頁
學習紀錄
遊戲心得影視Life書單案件檔案
Side Projects委託作品與二創互動實驗場
Kurau
百百 BLOG
首頁
學習紀錄
遊戲心得影視Life書單案件檔案
Side Projects委託作品與二創互動實驗場
Kurau

Kurau Blog

「隨心而寫,真真假假,都是我」

一個記錄生活、輸出興趣的個人空間。
遊戲、影視、閱讀、學習……每一段體驗都值得留下文字。

頁面導覽

  • 學習紀錄
  • 遊戲心得
  • 影視Life
  • 書單
  • 委託作品與二創
  • Kurau
  • 合作邀請

找到我

歡迎來 Discord 找我聊天!

“曾經發生的事不可能忘記,只是暫時想不起來而已。”-《神隱少女》

© 2026 Kurau All rights reserved

前端框架

新版的react-router-dom 與 tsconfig.json

By Kurau·2023-02-07·Updated 2026-05-09·3 分鐘閱讀

React Router v6+ 與 tsconfig.json

TL;DR
升級到 React Router v6 後 TS 編譯失敗?把 tsconfig.json 的 target 從 "es5" 改成 "ES2016"(或更新),因為 v6 內部用了 ES6+ 語法。
我的測試 demo
react-router-blp3hrsfv-bobo100.vercel.app

問題現場

升級 react-router-dom@6 後,build 出現:

Property 'matchAll' does not exist on type 'string'.
Property 'flatMap' does not exist on type 'Array'.

或者執行時:

TypeError: Cannot read properties of undefined (reading 'children')

原因

React Router v6 內部用了 ES2015+ 的 String/Array 方法(如 flatMap、matchAll、Array.from with iterator)。如果 tsconfig.json 的 target 還停在 "es5",TS lib 不會包含這些 API 的型別定義 → 編譯失敗。


修法

// tsconfig.json
{
  "compilerOptions": {
    "target": "ES2016",     // ← 從 "es5" 改成這個(或更新)
    "lib": ["dom", "dom.iterable", "esnext"],
    "module": "esnext",
    "moduleResolution": "node",
    "jsx": "react-jsx",
    "strict": true,
    "esModuleInterop": true,
    "resolveJsonModule": true
  }
}
json
為什麼至少 ES2016
Array.prototype.includes 是 ES2016 加的,React Router v6 的 path 比對用得到。安全起見可以直接設 "ES2020" 或更新,反正現代瀏覽器都支援。

target vs lib 的差別

設定影響
target決定 TS 編譯出來的 JS 用什麼語法(例:箭頭函式、async/await 是否要 polyfill)
lib決定哪些內建型別可用(例:Array.flatMap / String.matchAll 的型別)

target 設了之後 lib 預設會跟著,所以通常改 target 就夠了。如果只想要型別不想改編譯結果,單獨改 lib 即可。


各 React Router 版本最低 target

版本最低 target重大改動
v5ES5舊 API
v6ES2016+<Routes> / useNavigate / useParams 等新 hooks
v6.4+ES2018+加入 data API(loader / action)
v7ES2020+與 Remix 合併

React Router v6 重點 API

import { BrowserRouter, Routes, Route, useNavigate, useParams } from 'react-router-dom';

function App() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/posts/:id" element={<Post />} />
        <Route path="*" element={<NotFound />} />
      </Routes>
    </BrowserRouter>
  );
}

function Post() {
  const { id } = useParams();        // 取代 v5 的 props.match.params
  const navigate = useNavigate();    // 取代 v5 的 props.history
  // ...
}
tsx

目錄

    ◆ 相關文章

    • react-app-env.d.ts

      2026-05-09
    • React-Router-Dom V6 Anchor Link

      2026-05-09
    • Ladle 前端測試工具

      Ladle 前端測試工具

      2026-05-09
    • Human套件教學

      Human套件教學

      2026-05-09
    ← 上一篇如何取消Event的預設行為下一篇 →時間複雜度(time complexity)和空間複雜度(space complexity)

    ◆ 關於作者

    Kurau

    個人寫作 / 創作的 SoT,記錄遊戲、影視、學習與生活。

    更多 Kurau 的文章