콘텐츠로 이동
import { Events, Event } from '@hurum/core'

네임스페이스가 지정된 Event 생성자 그룹을 만들어요.

function Events<TPrefix extends string, TDefs extends Record<string, EventDefinition<unknown>>>(
prefix: TPrefix,
events: TDefs,
): EventCreatorMap<TPrefix, TDefs>
매개변수타입설명
prefixstring네임스페이스 접두사. Event 타입 문자열의 일부가 돼요 (예: 'Purchase').
eventsRecord<string, EventDefinition<T>>Event 이름에서 Event<T>() 마커로의 맵.

키가 events와 일치하는 객체. 각 값은 EventCreator예요.

const PurchaseEvent = Events('Purchase', {
saved: Event<{ purchase: Purchase }>(),
saveFailed: Event<{ error: Error }>(),
})
// Create event instances
PurchaseEvent.saved({ purchase })
// -> { type: 'Purchase/saved', purchase: ... }
// Access the type literal
PurchaseEvent.saved.type
// -> 'Purchase/saved' (string literal type, not string)

Event의 페이로드 형태를 정의하는 타입 마커예요. Events() 내부에서만 사용돼요.

function Event<T = {}>(): EventDefinition<T>
매개변수설명
T이 Event의 페이로드 타입. 기본값은 {} (페이로드 없음).

EventDefinition<T> 마커 객체. 런타임 동작은 없으며, 타입 추론을 위해서만 존재해요.

const CartEvent = Events('Cart', {
itemAdded: Event<{ item: CartItem }>(),
cleared: Event(), // no payload
})

Events()가 생성하는 각 Event 생성자의 타입이에요. 호출 가능한 함수이면서 .type 속성을 가져요.

속성타입설명
typeTType문자열 리터럴 타입 (예: 'Purchase/saved').
(payload: TPayload) => EventInstance<TType, TPayload>

생성자를 호출하면 EventInstance를 생성해요 — type과 페이로드 필드가 스프레드된 일반 객체예요.

const event = PurchaseEvent.saved({ purchase: myPurchase })
// event.type -> 'Purchase/saved'
// event.purchase -> myPurchase

런타임 Event 객체예요. type 판별 필드와 페이로드 속성을 포함하는 일반 객체예요.

type EventInstance<TType extends string, TPayload> = {
readonly type: TType
} & TPayload

Event는 불변의 사실 기록이에요. Store의 상태를 변경하는 유일한 메커니즘이에요.


값이 EventCreator인지 확인하는 타입 가드예요.

function isEventCreator(value: unknown): value is EventCreator

  • Event 타입은 '{prefix}/{name}' 형식을 따라요 (예: 'Purchase/saved').
  • Event 이름은 과거형으로 지정하세요. 무엇이 일어나야 하는지가 아닌, 무엇이 일어났는지를 기록해요.
  • Event는 런타임 의존성이 없어요. Command, Intent, Store보다 먼저 정의하세요.
  • .type 속성은 문자열 리터럴 타입을 유지해요. Hurum 내부에서 디스패치에 사용돼요. Store .on() 핸들러에서는 계산된 속성 키 대신 네임스페이스 형식 .on(MyEvent, { saved: handler }) 또는 개별 Event 형식 .on(MyEvent.saved, handler)을 사용하세요.