Add type definitions for events
diff --git a/README.md b/README.md
index 8ce7098..9541d5c 100644
--- a/README.md
+++ b/README.md
@@ -220,6 +220,7 @@
 you can also use addEventListener with the following events:
 - complete
 - loopComplete
+- drawnFrame
 - enterFrame
 - segmentStart
 - config_ready (when initial config is done)
diff --git a/index.d.ts b/index.d.ts
index 55e316d..ae5e4e3 100644
--- a/index.d.ts
+++ b/index.d.ts
@@ -1,8 +1,55 @@
 export type AnimationDirection = 1 | -1;
 export type AnimationSegment = [number, number];
-export type AnimationEventName = 'enterFrame' | 'loopComplete' | 'complete' | 'segmentStart' | 'destroy' | 'config_ready' | 'data_ready' | 'DOMLoaded' | 'error' | 'data_failed' | 'loaded_images';
+export type AnimationEventName = 'drawnFrame' | 'enterFrame' | 'loopComplete' | 'complete' | 'segmentStart' | 'destroy' | 'config_ready' | 'data_ready' | 'DOMLoaded' | 'error' | 'data_failed' | 'loaded_images';
 export type AnimationEventCallback<T = any> = (args: T) => void;
 
+/** Specifies the data for each event type. */
+export interface AnimationEvents {
+  DOMLoaded: undefined;
+  complete: BMCompleteEvent;
+  config_ready: undefined;
+  data_failed: undefined;
+  data_ready: undefined;
+  destroy: BMDestroyEvent;
+  drawnFrame: BMEnterFrameEvent;
+  enterFrame: BMEnterFrameEvent;
+  error: undefined;
+  loaded_images: undefined;
+  loopComplete: BMCompleteLoopEvent;
+  segmentStart: BMSegmentStartEvent;
+}
+
+export interface BMCompleteEvent {
+  direction: number;
+  type: "complete";
+}
+
+export interface BMCompleteLoopEvent {
+  currentLoop: number;
+  direction: number;
+  totalLoops: number;
+  type: "loopComplete";
+}
+
+export interface BMDestroyEvent {
+  type: "destroy";
+}
+
+export interface BMEnterFrameEvent {
+  /** The current time in frames. */
+  currentTime: number;
+  direction: number;
+  /** The total number of frames. */
+  totalTime: number;
+  type: "enterFrame";
+}
+
+export interface BMSegmentStartEvent {
+  firstFrame: number;
+  totalFrames: number;
+  type: "segmentStart";
+}
+
 export type AnimationItem = {
     name: string;
     isLoaded: boolean;
@@ -44,17 +91,17 @@
     playSegments(segments: AnimationSegment | AnimationSegment[], forceFlag?: boolean): void;
     setSubframe(useSubFrames: boolean): void;
     getDuration(inFrames?: boolean): number;
-    triggerEvent<T = any>(name: AnimationEventName, args: T): void;
-    addEventListener<T = any>(name: AnimationEventName, callback: AnimationEventCallback<T>): () => void;
-    removeEventListener<T = any>(name: AnimationEventName, callback?: AnimationEventCallback<T>): void;
+    triggerEvent<T extends AnimationEventName>(name: T, args: AnimationEvents[T]): void;
+    addEventListener<T extends AnimationEventName>(name: T, callback: AnimationEventCallback<AnimationEvents[T]>): () => void;
+    removeEventListener<T extends AnimationEventName>(name: T, callback?: AnimationEventCallback<AnimationEvents[T]>): void;
 }
 
-export type BaseRendererConfig = {
+export interface BaseRendererConfig {
     imagePreserveAspectRatio?: string;
     className?: string;
-};
+}
 
-export type SVGRendererConfig = BaseRendererConfig & {
+export interface SVGRendererConfig extends BaseRendererConfig {
     title?: string;
     description?: string;
     preserveAspectRatio?: string;
@@ -64,22 +111,22 @@
     viewBoxSize?: string;
     focusable?: boolean;
     filterSize?: FilterSizeConfig;
-};
+}
 
-export type CanvasRendererConfig = BaseRendererConfig & {
+export interface CanvasRendererConfig extends BaseRendererConfig {
     clearCanvas?: boolean;
     context?: CanvasRenderingContext2D;
     progressiveLoad?: boolean;
     preserveAspectRatio?: string;
-};
+}
 
-export type HTMLRendererConfig = BaseRendererConfig & {
+export interface HTMLRendererConfig extends BaseRendererConfig {
     hideOnTransparent?: boolean;
-};
+}
 
 export type RendererType = 'svg' | 'canvas' | 'html';
 
-export type AnimationConfig<T extends RendererType = 'svg'> = {
+export interface AnimationConfig<T extends RendererType = 'svg'> {
     container: Element;
     renderer?: T;
     loop?: boolean | number;
@@ -101,7 +148,7 @@
     }
 }
 
-export type TextDocumentData = {
+export interface TextDocumentData {
     t?: string;
     s?: number;
     f?: string;
@@ -113,22 +160,22 @@
     fc?: [number, number, number];
 }
 
-export type AnimationConfigWithPath<T extends RendererType = 'svg'> = AnimationConfig<T> & {
+export interface AnimationConfigWithPath<T extends RendererType = 'svg'> extends AnimationConfig<T> {
     path?: string;
 }
 
-export type AnimationConfigWithData<T extends RendererType = 'svg'> = AnimationConfig<T> & {
+export interface AnimationConfigWithData<T extends RendererType = 'svg'> extends AnimationConfig<T> {
     animationData?: any;
 }
 
-export type FilterSizeConfig = {
+export interface FilterSizeConfig {
     width: string;
     height: string;
     x: string;
     y: string;
-};
+}
 
-export type LottiePlayer = {
+export interface LottiePlayer {
     play(name?: string): void;
     pause(name?: string): void;
     stop(name?: string): void;
@@ -142,7 +189,7 @@
     setLocationHref(href: string): void;
     setIDPrefix(prefix: string): void;
     updateDocumentData(path: (string|number)[], documentData: TextDocumentData, index: number): void;
-};
+}
 
 declare const Lottie: LottiePlayer;