Как объявить тип только для записываемых свойств объекта?

Вот очень упрощенная версия 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`;
Исидор
Вопрос задан22 февраля 2024 г.

1 Ответ

2
Сидор
Ответ получен6 сентября 2024 г.

Ваш ответ

Загрузить файл.