export type OmitByType = { [P in keyof T as T[P] extends Value | undefined ? never : P]: T[P]; }; export type BaseType = { id: number; attributes: Record; }; export type ExtractArr = T extends Array ? T[number] : T; /** * convert {id:number,data:{a:any,b:any,c:{data:{id:number,attributes:{}}}...}} * to {c:{data:{id:number,attributes:{}}}} * pick only relation attrs */ export type PickRelations = OmitByType; export type OmitRelations = OmitByType; /** * get all relation attrs keys */ export type RelationKeys = keyof PickRelations; /** * convert {id:number,data:{a:any,b:any,c:{data:{id:number,attributes:{}}},d:any...}} * to {id:number,a:any,d:any...} * exclude relation attrs */ export type MergeAttrs = { [K in (keyof OmitRelations) | "id"]?: K extends "id" ? number : T["attributes"][K]; }; export type RelationObj> = Required[K]["data"]; export type Concat = [...T, ...U]; type UnionToIntersection = (U extends U ? (arg: U) => any : never) extends (arg: infer P) => any ? P : never; export type UnionToTuple = UnionToIntersection T : never> extends () => infer ReturnType ? [...UnionToTuple>, ReturnType] : []; export type IsAny = (any extends T & 0 ? 1 : 2) extends 1 ? true : false; export type Join = T extends [ infer Head extends string, ...infer Tail extends string[] ] ? `${Head}${Tail['length'] extends 0 ? '' : U}${Join}` : ''; export type LengthOfString = S extends `${infer F}${infer R}` ? LengthOfString : L['length']; export {};