Store 클래스
Store<T>는 @ilokesto/store가 내보내는 구체 public class입니다. 패키지는 createStore() factory와 구조적 ReadableStore<T> / StoreApi<T> 계약도 내보냅니다.
import { Store } from "@ilokesto/store";
const store = new Store({ ready: false });Constructor
new Store<T>(initialState: T)constructor는 initialState를 첫 현재 상태로 저장하고, 동시에 getInitialState()가 반환할 값으로 보관합니다.
복제는 일어나지 않습니다. 객체를 전달했다면 소유권 규칙을 지키세요. store에 넘긴 뒤에는 그 객체를 불변 값처럼 다루는 편이 안전합니다.
getState()
getState(): Readonly<T>현재 상태를 동기적으로 반환합니다. Readonly<T> 타입은 반환 값을 통해 직접 대입하는 일을 줄여주지만, 런타임 freeze를 만들지는 않으며 TypeScript 관점에서도 깊은 불변은 아닙니다.
const state = store.getState();
console.log(state.ready);getState()는 다음 경우에 사용하세요.
- 즉시 필요한 값을 계산할 때,
subscribe()리스너 안에서,- 최신 snapshot을 렌더링해야 하는 어댑터 코드에서.
상태를 제자리에서 직접 수정하기 위한 통로로 사용하지 마세요.
getInitialState()
getInitialState(): Readonly<T>constructor가 잡아 둔 정확한 초기 값을 반환합니다.
const initial = store.getInitialState();getInitialState()는 store를 reset하지 않습니다. reset하려면 직접 초기 값을 setState()에 다시 전달하세요.
store.setState(store.getInitialState());현재 상태가 이미 초기 상태와 같은 참조라면 Object.is 때문에 알림이 발생하지 않습니다. 객체 상태 reset에 구독자가 반응해야 한다면 같은 필드를 가진 새 객체를 전달하세요.
Factory와 구조적 계약
createStore(initialState)는 항상 새로운 구체 Store<T>를 만듭니다. Store와 같은 형태의 값을 감지하거나 재사용하지 않습니다.
import { createStore, type ReadableStore, type StoreApi } from "@ilokesto/store";
const counter = createStore({ count: 0 });
const reader: ReadableStore<{ count: number }> = counter;
const writer: StoreApi<{ count: number }> = counter;읽기와 구독만 필요한 소비자는 ReadableStore<T>를 사용하세요. 쓰기와 middleware 등록도 필요하면 StoreApi<T>를 사용하세요. 이 구조적 interface는 어댑터에 유용하며, 내장 구현이 필요한 애플리케이션은 계속 Store<T>를 사용하면 됩니다.
set(value)는 명확한 값 교체를 제공하고 update(updater)는 계산을 명시합니다. T 자체가 함수일 때 이 구분이 중요합니다. setState(fn)은 계속 updater로 해석됩니다. 세 쓰기 경로는 모두 같은 middleware pipeline을 사용합니다.
Public API 요약
Store<T>: 상태 값 하나를 소유합니다.getState(): 현재 값을 읽습니다.getInitialState(): constructor 값을 읽습니다.setState(): middleware 이후 값을 교체하거나 updater로 계산합니다.subscribe(): 리스너를 등록하고 cleanup을 반환합니다.pushMiddleware()/unshiftMiddleware(): 업데이트 미들웨어를 조합합니다.createStore(): 새로운 구체 store를 만듭니다.ReadableStore<T>/StoreApi<T>: 구조적인 읽기 전용 및 쓰기 가능 계약입니다.set()/update(): 명시적인 교체와 계산입니다.subscribeSelector(): 파생된 selection을 구독합니다.
교체와 오류 동작은 setState에서, 구독 소유권과 selector 전달은 subscribe에서 이어서 확인하세요.