# 日文動詞「行いて」寫錯了？讓 TypeScript 編譯器幫你批改｜Typed Japanese 實測

- 網址：https://blog.valenvan.uk/posts/typedgrammar-typed-japanese.html
- 發布日期：2026-11-01
- 測試設備：Mac mini M4 Pro（12 核、64GB）
- 專案：typedgrammar/typed-japanese（https://github.com/typedgrammar/typed-japanese），MIT 授權
- 測試版本：0.1.0（提交 8a9f55ec）
- 實測影片：https://www.youtube.com/watch?v=ngJZTjIPgv0

## 重點摘要

- Typed Japanese 把日文動詞變化規則寫成 TypeScript 型別，答案寫錯時由編譯器報錯。
- 實測 4 個正確て形（行って、書いて、買って、食べて）全部通過檢查，結束碼 0。
- 故意寫成學習者常犯的「行いて」「買いて」，2 個都被擋下（結束碼 2），錯誤訊息直接列出正解「行って」「買って」。
- 它不是翻譯器，本次只驗證 4 個動詞的て形，使用者需要會一點 TypeScript；npm install 約 25 秒。
- **結論：** 適合會寫一點 TypeScript 的日文學習者，當動詞て形的練習本；不是翻譯器，只驗證 4 個動詞。
- **適合：** 學日文且會一點 TypeScript 的人
- **不適合：** 完全沒接觸過程式的人，或想要翻譯、整句文法檢查的人

| 實測項目 | 結果 |
|---|---|
| 正確答案（行って、書いて、買って、食べて） | 4/4 通過，exit 0 |
| 錯誤答案（行いて、買いて） | 2/2 被擋，exit 2，訊息列出正解 |
| 錯誤答案（書って） | 被擋，訊息列出正解書いて |
| npm install | 約 25 秒 |

寫日文作業時，你想說「行って」（去了之後），手一滑寫成「行いて」，老師打了一個叉。為什麼「買う」是「買って」、「行く」也是「行って」，「書く」卻是「書いて」？這類動詞變化（て形）規則多、例外也多，靠背很容易混。

Typed Japanese 的做法很特別：它把日文文法規則寫成 TypeScript 的型別。你把答案寫進程式裡，TypeScript 編譯器檢查，寫錯就直接報錯。我們拿它實際驗證了動詞て形，結果如下。

測試設備：Mac mini M4 Pro（12 核、64GB）；受測版本 0.1.0（提交 8a9f55ec），授權 MIT。

## 先說清楚它是什麼、不是什麼

- 它是一組 TypeScript 型別定義，不是翻譯器，也不是網頁課程。
- 只能檢查它內建規則涵蓋的變化；本文只驗證 4 個動詞的て形（行く、書く、買う、食べる）。
- 你需要會一點 TypeScript，至少能安裝 Node.js、執行 `npx`，看得懂型別錯誤訊息。

## 安裝

```bash
git clone https://github.com/typedgrammar/typed-japanese.git
cd typed-japanese
npm install --ignore-scripts
npm run typecheck   # 官方檢查，無錯誤
```

`npm install` 本次約 25 秒，官方檢查不到 1 秒。

## 實測一：四個正確答案

建立 `src/mine/good.ts`：

```ts
import type { ConjugateVerb, GodanVerb, IchidanVerb } from "../verb-types";

type 行く = GodanVerb & { stem: "行"; ending: "く" };
type 書く = GodanVerb & { stem: "書"; ending: "く" };
type 買う = GodanVerb & { stem: "買"; ending: "う" };
type 食べる = IchidanVerb & { stem: "食べ"; ending: "る" };

export const a: ConjugateVerb<行く, "Te"> = "行って";
export const b: ConjugateVerb<書く, "Te"> = "書いて";
export const c: ConjugateVerb<買う, "Te"> = "買って";
export const d: ConjugateVerb<食べる, "Te"> = "食べて";
```

```bash
npx tsc --noEmit --strict --skipLibCheck --target es2020 --pretty false src/mine/good.ts
```

四個全部通過，結束碼 0。連「行く」這個て形不照一般規則（不是「行いて」）的例外，它的型別也有處理。

![四個正確答案通過檢查](https://blog.valenvan.uk/img/typedgrammar-typed-japanese-article_1.png)

## 實測二：學習者常犯的錯

把答案改成「行いて」「買いて」，同樣的指令跑出：

```text
src/mine/bad.ts(6,14): error TS2322: Type '"行いて"' is not assignable to type '"行って"'.
src/mine/bad.ts(7,14): error TS2322: Type '"買いて"' is not assignable to type '"買って"'.
```

結束碼 2，兩個都被擋下。怎麼讀這段訊息：`Type '"行いて"'` 是你寫的，`type '"行って"'` 是正解。所以它不只告訴你錯了，還直接給你答案。

![錯誤被擋下並列出正解](https://blog.valenvan.uk/img/typedgrammar-typed-japanese-article_2.png)

另外測了「書って」（把「書く」誤寫成促音），同樣被擋，訊息指出正解是「書いて」。

## 結果整理

| 項目 | 結果 |
|---|---|
| 正確答案：行って、書いて、買って、食べて | 4/4 通過（exit 0） |
| 錯誤答案：行いて、買いて | 2/2 被擋（exit 2），訊息列出正解 |
| 錯誤答案：書って | 被擋，訊息列出正解「書いて」 |
| 安裝 | npm install 約 25 秒 |

## 常見問題

**為什麼不直接用字典或翻譯軟體？** 字典告訴你單字的意思，Typed Japanese 檢查的是「你寫的變化形對不對」。它把規則寫在型別裡，你猜一個答案，編譯器立刻比對，適合反覆練習。

**可以測哪些變化？** 專案 README 列出的動詞變化包含辭書形、ます形、て形、た形、ない形、可能形等，用法是把 `"Te"` 換成其他名稱（例如 `"Ta"`）。本文只實際驗證て形，其他形式請自己先小量測試再信任。

**錯誤訊息看不懂怎麼辦？** 找 `is not assignable to type` 這句：前面是你寫的，後面是它認定的正解。行號 `(6,14)` 代表第 6 行第 14 個字元，對照檔案就知道是哪一題。

**安裝卡住？** 需要 Node.js（本次測試用 22 版）。若 `npm install` 有關於 eslint 的棄用警告，是套件本身的提示，本次不影響型別檢查。

## 適合與不適合

適合：正在學日文、同時會寫一點 TypeScript 的人，把它當動詞變化的練習本：先自己猜答案寫進去，讓編譯器批改。

不適合：完全沒接觸過程式的人（光是安裝環境就有門檻）、想要翻譯或整句文法檢查的人。本次只驗證 4 個動詞的て形，其他活用形與完整句子沒有測。

## 專案資訊

- 專案連結：https://github.com/typedgrammar/typed-japanese
- 授權：MIT
