TypeScript: テストのためだけに export しない → Vitest の In-source testing
内部関数をテストしたいだけで export すると、「他でも使われているかも」と読み手の負担が増える。Vitest の in-source testing なら、同じファイル内にテストを書け、本番ビルドからはテストコードが取り除かれる。
コード例
ts
// src/price.ts
function applyDiscount(price: number, rate: number) { // export しない
return Math.round(price * (1 - rate));
}
export function finalPrice(price: number) {
return applyDiscount(price, 0.1);
}
if (import.meta.vitest) {
const { it, expect } = import.meta.vitest;
it("applyDiscount", () => {
expect(applyDiscount(1000, 0.1)).toBe(900);
});
}ts
// vitest.config.ts
import { defineConfig } from "vitest/config";
export default defineConfig({
test: { includeSource: ["src/**/*.{js,ts}"] },
define: { "import.meta.vitest": "undefined" }, // 本番ビルドでテストを除去
});jsonc
// tsconfig.json
{ "compilerOptions": { "types": ["vitest/importMeta"] } }注意点
- 本番のバンドラ(Vite 以外を含む)でも
import.meta.vitestをundefinedに置き換える設定が必要。そうしないとテストコードが残る。 - 大きなテストは従来どおり別ファイルの方が読みやすい。小さな純粋関数向け。