rudeshark.net/packages/client/src/scripts/form.ts
ThatOneCalculator 6b00abf05c
refactor: 🎨 rome
2023-01-12 20:40:33 -08:00

73 lines
1.3 KiB
TypeScript

export type FormItem =
| {
label?: string;
type: "string";
default: string | null;
hidden?: boolean;
multiline?: boolean;
}
| {
label?: string;
type: "number";
default: number | null;
hidden?: boolean;
step?: number;
}
| {
label?: string;
type: "boolean";
default: boolean | null;
hidden?: boolean;
}
| {
label?: string;
type: "enum";
default: string | null;
hidden?: boolean;
enum: string[];
}
| {
label?: string;
type: "radio";
default: unknown | null;
hidden?: boolean;
options: {
label: string;
value: unknown;
}[];
}
| {
label?: string;
type: "object";
default: Record<string, unknown> | null;
hidden: true;
}
| {
label?: string;
type: "array";
default: unknown[] | null;
hidden: true;
};
export type Form = Record<string, FormItem>;
type GetItemType<Item extends FormItem> = Item["type"] extends "string"
? string
: Item["type"] extends "number"
? number
: Item["type"] extends "boolean"
? boolean
: Item["type"] extends "radio"
? unknown
: Item["type"] extends "enum"
? string
: Item["type"] extends "array"
? unknown[]
: Item["type"] extends "object"
? Record<string, unknown>
: never;
export type GetFormResultType<F extends Form> = {
[P in keyof F]: GetItemType<F[P]>;
};