Skip to content

Instantly share code, notes, and snippets.

@flisboac
Created October 31, 2018 22:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save flisboac/d97a2293b1d20a421b78af1142a40aba to your computer and use it in GitHub Desktop.
Save flisboac/d97a2293b1d20a421b78af1142a40aba to your computer and use it in GitHub Desktop.
Some ideas about type shaping from other types, applied to form data handling/type-safety. Please, use Yup instead, makes much more sense. :)
type FormFieldTuple<T> = { value: Required<T>, valid: boolean, message?: string };
type FormFieldData<T>
= T extends undefined ? FormFieldTuple<T> | undefined
: FormFieldTuple<T>
;
type FormFields<F, K extends keyof F = keyof F> = { [KK in K]:
F[KK] extends object ? FormFields<F[KK]> : FormFieldData<F[KK]>
};
type FormField<F, K extends keyof F, T = never> = { [KK in K]:
[T] extends [never]
? F[KK] extends object ? FormFields<F[KK]> : FormFieldData<F[KK]>
: T extends object ? T : never
};
interface User {
id: number;
login: string;
loginCount?: number;
}
interface Person {
id: number;
user: User;
name: string;
lastName: string;
phone: number;
}
type PersonFormData = FormFields<Person, "name" | "lastName">
& FormField<Person, 'user', FormField<User, 'login' | 'loginCount'>>;
var a: PersonFormData = {
lastName: { value: '', valid: false },
name: { value: '', valid: false },
user: {
login: { value: '', valid: false }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment