jenesius-vue-form
Version:
Heavy form system for Vue.js
47 lines (46 loc) • 4.19 kB
TypeScript
export interface CompareItem {
name: string;
oldValue: any;
newValue: any;
}
/**
* @description Вернёт массив: результат сравнения. Результат сравнения из себя представляет название поля, которые
* отличаются от исходного объекта. Если поле N присутствует в newValue и присутствует в объекте oldValue и его значение
* в этих объектах идентичное - данное поле не будет возвращено в результате работы данной функции. В любых иных случаях:
* В новом объекте поле есть, а в старом нет (поле было добавлено) или в старом объекте поле есть, а в новом нет (поле
* было удалено) - поле будет выведено в результате.
*
* @problem Что произойдёт если во вложенном объекте будет изменение? В таком случае мы всё-равно генерируем event
* в котором уведомляем, что всё значение было изменено. Это не проблема. Если один из дочерних элементов был изменён, то
* и родительский тоже. Дальше можно рекурсивно пройтись и узнать что именно было изменено. В худшем случае можно расширить
* CompareItem и добавить туда difference: [], с массивом изменённых полей.
*
* @param {Object} newValue объект новых(исходных) значений
* @param {Object} oldValue объект старых значений
*/
export declare function compareDifference(oldValue: unknown, newValue: unknown): CompareItem[];
/**
*
*
* @param sourceValue Исходные объект
* @param changes Изменения, которые были внесены в исходный объект.
* @description В отличии от предыдущей функции, данная функция принимает изменения и объект, на который будут
* производиться изменения. Из этого можно сделать вывод, что второй объект необходим лишь для двух вещей:
* 1. Было ли поле изменено. В случае, если в изменениях пришло {name: "J"}, а в объекте и так было поле {name: "J"}, то
* данное поле не будет помечено, как изменённое.
* 2. Чтобы получить старое значение. (oldValue)
* То есть мы уже имеем набор изменений, на полноценное сравнивать два объекта не надо, а лишь надо спроецировать первый
* (изменения) на второй и сравнить, какие именно изменения будут произведены.
*
* Также нужно помнить, что изменения лишь проецируются на исходные значения. Иными словами, если
* исходные значения {coordinate: {x: 1}}
* изменения: {coordinate: {y: 2}}
* результирующий объект(который предполагается): { coordinate: { x: 1, y: 2 } }
* и в данном случае мы получаем, что у нас два изменения:
* [
* { name: 'coordinate', newValue: { x: 1, y: 2 }, oldValue: { x: 1 } },
* { name: 'coordinate.y', newValue: 2, oldValue: undefined }
* ]
* */
export declare function compareMergeChanges(sourceValue: any, changes: any): CompareItem[];
export declare function compareDTO(name: string, newValue: any, oldValue: any): CompareItem;