UNPKG

moysklad-api-model

Version:

Объектная модель API МойСклад для TypeScript проектов

35 lines (34 loc) 3.38 kB
import type { Collection, CollectionRef, EntityByMetaType, EntityRef, AttributeMetadata } from '../'; import type { FinaceOperationMetaType } from '../Finance'; /** * Возвращает развернутый тип для указанного поля */ export type ExpandedField<T, K extends string> = T extends Array<infer Item> | Collection<infer Item> ? K extends keyof Item ? ExpandedField<Item, K> : `[Error] ExpandedField: Неизвестное поле '${K}' внутри списка или коллекции` : T extends CollectionRef<infer Item> ? K extends keyof EntityByMetaType[Item] ? Collection<ExpandField<EntityByMetaType[Item], K> & EntityByMetaType[Item]> : `[Error] ExpandedField: Неизвестное поле '${K}' внутри CollectionRef<'${Item}'>` : K extends keyof T ? T[K] extends EntityRef<infer M> | undefined ? T[K] extends { id: string; } ? T[K] : T[K] extends { rows: Array<any>; } ? T[K] : T[K] extends CollectionRef<M> ? Collection<EntityByMetaType[M]> : T[K] extends CollectionRef<M> | undefined ? Collection<EntityByMetaType[M]> | undefined : T[K] extends EntityRef<M> ? EntityByMetaType[M] : T[K] extends EntityRef<M> | undefined ? EntityByMetaType[M] | undefined : '[Error] never-pDw3s' : T[K] : `[Error] ExpandedField: Неизвестный путь "${K}" #9al4cs`; /** * Возвращает тип в котором развернуто указанное поле */ export type ExpandField<T, K extends keyof T> = { [P in keyof T]: K extends P ? T[P] extends Array<EntityRef<infer M>> | undefined ? P extends 'operations' ? Array<EntityByMetaType[FinaceOperationMetaType] & { linkedSum: number; }> : T[P] extends Array<EntityRef<M>> ? Array<EntityByMetaType[M]> : T[P] extends Array<EntityRef<M>> | undefined ? Array<EntityByMetaType[M]> | undefined : 'never-3yswqc' : T[P] extends EntityRef<infer M> | undefined ? T[P] extends { id: string; } ? T[P] : T[P] extends { rows: Array<any>; } ? T[P] : T[P] extends CollectionRef<'attributemetadata'> ? Collection<AttributeMetadata> : T[P] extends CollectionRef<M> ? Collection<EntityByMetaType[M]> : T[P] extends CollectionRef<M> | undefined ? Collection<EntityByMetaType[M]> | undefined : T[P] extends EntityRef<M> ? EntityByMetaType[M] : T[P] extends EntityRef<M> | undefined ? EntityByMetaType[M] | undefined : 'never-eus8s' : T[P] : T[P]; }; /** * Разворачивает только одно поле типа по строке expand в формате API МойСклад */ export type ExpandPath<T, Path extends string> = string extends Path ? never : T extends Array<infer M> ? Array<ExpandPath<M, Path>> : T extends Collection<infer U> ? { [P in keyof T]: P extends 'rows' ? ExpandPath<U, Path>[] : T[P]; } : Path extends `${infer Field}.${infer Rest}` ? { [P in keyof T]: Field extends P ? ExpandPath<ExpandedField<T, Field>, Rest> : T[P]; } : Path extends keyof T ? ExpandField<T, Path> : never; /** * Разворачивает поля типа по строке expand в формате API МойСклад */ export type Expand<T, ExpandStr extends string | undefined> = ExpandStr extends undefined ? T : string extends ExpandStr ? never : ExpandStr extends `${infer Tail},${infer Rest}` ? Expand<ExpandPath<T, Tail>, Rest> : ExpandStr extends string ? ExpandPath<T, ExpandStr> : never;