moysklad-api-model
Version:
Объектная модель API МойСклад для TypeScript проектов
35 lines (34 loc) • 3.38 kB
TypeScript
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;