mergeTargetProperties = targetProperties => {
	/** @type {Set<keyof TargetProperties>} */
	const keys = new Set();
	for (const tp of targetProperties) {
		for (const key of Object.keys(tp)) {
			keys.add(/** @type {keyof TargetProperties} */ (key));
		}
	}
	/** @type {TargetProperties} */
	const result = {};
	for (const key of keys) {
		let hasTrue = false;
		let hasFalse = false;
		for (const tp of targetProperties) {
			const value = tp[key];
			switch (value) {
				case true:
					hasTrue = true;
					break;
				case false:
					hasFalse = true;
					break;
			}
		}
		if (hasTrue || hasFalse)
			/** @type {TargetProperties} */
			(result)[key] = hasFalse && hasTrue ? null : Boolean(hasTrue);
	}
	return result;
}
@param {TargetProperties[]} targetProperties array of target properties
@returns {TargetProperties} merged target properties