Cover Image for [TypeScript] export default したclassを require できなくてハマった話

[TypeScript] export default したclassを require できなくてハマった話

この記事は最終更新日から4年以上が経過しています。

TL;DR

  • jest で mock かけるために、import ではなく require する必要があった
  • new できなくて困った
  • const MyClass = require("./MyClass").default にする必要があった

実例

// ./MyClass.ts
class MyClass {
	constructor(){
		console.log("aaaaaa");
	}

	async data(): Promise<string> {
		return Promise.resolve("some string")
	}
}

export default MyClass

// ./MyClass.test.ts
test('basic', async () => {
	// なんらかの mock 処理    
	const MyClass = require('./MyClass');
	const myClass = new MyClass();    
	const data = await myClass.data();    
	expect(data).toBe("some string");
});

import で読み込めばいいが、jest で mock かけるために、import が使えなかったので require する必要があった

失敗した例。MyClass が constractor ではないというエラーが出る

// ./MyClass.test.ts
test('basic', async () => {
	// なんらかの mock 処理    
-	const MyClass = require('./MyClass');
+	const MyClass = require('./MyClass').default;
	const myClass = new MyClass();    
	const data = await myClass.data();    
	expect(data).toBe("some string");
});

こうすればできた。

雑感

  • default が 本当にdefaultとして解釈される場合と、defaultを指定しないといけない場合がある。TypeScript のこの辺の挙動は難しいね。
  • クソザコなので export/import があんまり理解できてない。