Skip to main content
Version: Latest

TypeScript Errors

This page covers type-related build errors when using the Dragble SDK with TypeScript.

Using the SDK with TypeScript

The Dragble SDK is loaded via CDN, so you need to add type declarations for the global dragble object.

Adding type declarations

Create a type declaration file in your project:

src/dragble.d.ts
declare global {
interface Window {
dragble: DragbleSDK;
}
}

interface DragbleConfig {
containerId: string;
editorKey?: string;
editorMode?: "email" | "web";
user?: { id: string; name: string; email: string };
appearance?: { theme?: "light" | "dark"; accentColor?: string };
mergeTags?: { customMergeTags?: Array<{ label: string; value: string }> };
specialLinks?: Array<{ name: string; href: string; target?: string }>;
customFonts?: Array<{ label: string; value: string; url: string }>;
ai?: Record<string, unknown>;
onReady?: () => void;
onImageUpload?: (
file: File,
done: (result: { progress: number; url?: string }) => void,
) => void;
onGenerateText?: (
request: Record<string, unknown>,
done: (result: Record<string, unknown>) => void,
) => void;
onGenerateImage?: (
request: Record<string, unknown>,
done: (result: Record<string, unknown>) => void,
) => void;
}

interface DragbleEditorInstance {
loadDesign(json: Record<string, unknown>): void;
getDesign(): Record<string, unknown>;
exportJson(callback: (json: Record<string, unknown>) => void): void;
exportHtml(): Promise<{ html: string }>;
exportImage(
callback: (data: { url: string }) => void,
options?: { timeout?: number },
): void;
exportPdf(
callback: (data: { url: string }) => void,
options?: { timeout?: number },
): void;
undo(): void;
redo(): void;
setAppearance(appearance: Record<string, unknown>): void;
showPreview(mode?: "desktop" | "tablet" | "mobile"): void;
hidePreview(): void;
setViewMode(mode: "desktop" | "tablet" | "mobile"): void;
setTheme(theme: "light" | "dark"): void;
addEventListener(event: string, handler: Function): void;
removeEventListener(event: string, handler: Function): void;
destroy(): void;
}

interface DragbleSDK {
createEditor(config: DragbleConfig): Promise<DragbleEditorInstance>;
init(config: DragbleConfig): void;
exportHtml(callback: (data: { html: string }) => void): void;
saveDesign(callback: (design: Record<string, unknown>) => void): void;
loadDesign(design: Record<string, unknown>): void;
addEventListener(event: string, handler: Function): void;
removeEventListener(event: string, handler: Function): void;
}

export {};

Strict null checks on editor methods

What you see:

error TS18047: 'editorRef.current' is possibly 'null'.

Why it happens: Your editor instance might be null when accessed before initialization.

Fix: Use optional chaining:

// Correct
editorRef.current?.exportHtml().then((data) => {
/* ... */
});

// Also correct
if (editorRef.current) {
editorRef.current.loadDesign(design);
}

Quick checklist

CheckHow to verify
Types declareddeclare const dragble: DragbleSDK; in your code
tsconfig.json includes declaration file"include": ["src/**/*"] covers the .d.ts file
Optional chaining on editor methodseditor?.exportHtml()
Container element existsdocument.getElementById(containerId) is not null