TypescriptΒΆ

redux-db comes with a set of interfaces that you may use to define a strongly typed session.

import * as ReduxDB from "redux-db";

// Given the schema
export const schema = {
    "Project": {
        "id": { type: "PK" }
    },
    "Task": {
        "id": { type: "PK" },
        "projectId": { propName: "project", references: "Project", relationName: "tasks" }
    }
}

// Data models
export interface Project {
    id: number,
    title: string;
}
export interface Task {
    id: number;
    projectId: number;
}

// Schema models
export interface ProjectRecord extends ReduxDB.TableRecord<Project> {
    tasks: ReduxDB.TableRecordSet<TaskRecord>;
}

export interface TaskRecord extends ReduxDB.TableRecord<Task> {
    project: ProjectRecord;
}

export interface Session {
    Project: ReduxDB.Table<Project, ProjectRecord>;
    Task: ReduxDB.Table<Task, TaskRecord>;
}

// Reducer
export const dbReducer = (session: Session, action: { type: string, payload: any }) => {
    const { Project, Task } = session;

    switch (action.type) {
        case "SOME_ACTION": {
            const project = Project.get(action.payload);
            // project.tasks === typeof RecordSet<TaskRecord>
            // project.tasks.map( t=> t.value === typeof Task )
            break;
        }
    }
}