一般的にTypeScriptでDIをしようとするとクラス+デコレータを避けて通れません しかし個人的には関数型っぽくコーディングするのが好きなのでクラスもデコレータも使わず関数だけでDIする方法を考えました たった15行なので解説の前にコードを紹介します type Deps<T extends Record<string, any>> = { [P in keyof T]: T[P] extends { _velona: boolean } ? (...args: Parameters<T[P]>) => ReturnType<T[P]> : T[P] } export const depend = <T extends Record<string, any>, U extends any[], V>( dependencies: T, cb: (deps: Deps<T>, ...arg