Вот очень упрощенная версия codeа, над которым я работаю, целью которого является создание двух новых элементов div в средних точках X и Y родительского элемента div. Не обращайте внимания на то, что существуют гораздо более оптимальные способы сделать это — это всего лишь фрагмент логики для примера.
Я стремлюсь сохранить повторяющийся code, дважды перебирая основную логику, заменяя ее ' width" и "left" для "height" и "top" при втором проходе.
Я придумал вышеуказанное решение, создав тип WritableCSSProperties
для предотвращения TypeScript. от расстроения свойствами, доступными только для чтения, присутствующими в объекте CSSStyleDeclaration
.
Разве нет более элегантного решения для исключения свойств, доступных только для чтения, из объекта при приведении типов? Кажется, это не является чем-то необычным, и я чувствую, что моя реализация не обязательно оптимальна.
Более того, меня не особенно устраивают эти строки codeа:
type WritableCSSProperties = Omit<CSSStyleDeclaration, 'parentRule' | 'length' | 'item' |
'getPropertyPriority' | 'getPropertyValue' | 'removeProperty' | 'setProperty'>;
const parentDiv = document.querySelector('#parentDiv');
const clientRect = parentDiv.getBoundingClientRect();
const clientRectProperties: ReadonlyArray<keyof DOMRect> = ['width', 'height'];
const styleProperties: ReadonlyArray<keyof WritableCSSProperties> = ['left', 'top'];
for (let a = 0; a < 2; a++) {
let midpoint = (clientRect[clientRectProperties[a]] as number) / 2
const newDiv = document.createElement('div');
(newDiv.style as WritableCSSProperties)[styleProperties[a]] = `${midpoint}px`;
parentDiv.appendChild(newDiv);
}
let midpoint = (clientRect[clientRectProperties[a]] as number) / 2
(newDiv.style as WritableCSSProperties)[styleProperties[a]] = `${midpoint}px`;