async constructor
実はconstructorを非同期処理にする手段がある
JavaScriptのclassでconstructorをawaitしたい時
code:js
class AsyncClass {
constructor() {
console.debug("start constructing");
return new Promise(
(resolve) => setTimeout(() => {
console.debug("constructed!");
resolve(this);
}, 1000)
);
}
}
const cls = await new AsyncClass();
console.debug(cls)
ほんとだ。こんなことできるんだtakker.icon
constructorの戻り値の仕様の応用のようだ
https://developer.mozilla.org/docs/Web/JavaScript/Reference/Classes/constructor
https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/new
TypeScript
constructorの戻り値を想定していないため、普通にawait newすると警告が出る
new()=>Tをnew () => Promise<T>に無理やり型変換するといける
ただし、propsのない場合のみ
code:ts
class AsyncClass {
constructor() {
console.debug("start constructing");
return new Promise<this>(
(resolve) => setTimeout(() => {
console.debug("constructed!");
resolve(this);
}, 1000)
);
}
}
const Constructor: new () => Promise<AsyncClass> = AsyncClass as unknown as new () => Promise<AsyncClass>;
const cls = await new Constructor();
console.log(cls)
https://github.com/microsoft/TypeScript/issues/27594#issuecomment-453084861
class 構文で好きな値を return できるようになってる
#2025-09-07 16:52:57
#2025-08-16 13:53:09