要在 CommonJS module 中使用 ESM 必須透過動態 import;但型別是編譯時期的資訊,一定要用靜態 import。透過宣告檔案(Declaration File)可以解決這個問題。
首先加一個 .d.ts
重新 export 你用到的 type:
// type-wrapper.d.ts
export type { SomeType } from 'some-esm-package';
// ...
這樣你就可以如同使用其他 CommonJS 一樣 import 它;實際使用到物件/值的地方還是得需要 dynamic import:
// your .ts source file
import type { SomeType } from './type-wrapper'
// ...
const module = await import('some-esm-package');
const { someValue } = module;
// ...