Показать сообщение отдельно
  #38 (permalink)  
Старый 25.05.2023, 18:13
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,753

Сообщение от webgraph
У меня есть сильное чувство, что её просто скоро завезут в JS.
Ну есть такие предложения. Но описания типов только для пишущего и читающего код. Сам движок никакой проверки производить не будет. Он будет считать такие описания комментариями. Для IDE это будет помощь. Но в принципе такое уже есть - JSDOC. VSCode вполне успешно с ним работает. Почти, как в ts (некоторые возможности не реализованы) - проверяет типы объектов, переменных, функций... Но более многословен, чем ts
Одно из преимуществ - отсутствие этапа компиляции. В небольших проектах, по мне, он нафиг не нужен.
Код передается браузеру как есть. Может быть спокойно минификирован.
Например, кусок кода с JSDOC
/**
 * @typedef BiblioElemNum
 * @type {{
 * [id:string]:{
 * 		elem:HTMLElement,
 * 		num:number,
 * 		cites:HTMLAnchorElement[],
 * }
 * }}
 */
 
/**
 * @type {?BiblioElemNum}
 */
let biblioids = null;


/**
 * @param {HTMLElement} elem
 */
const insertBiblioBut = (elem) => {
	elem.style.position = 'relative';
	const biblbut = /** @type {DocumentFragment} */ (bibliobut.cloneNode(true));
	$data(
		/**@type {HTMLElement}*/ ($di(biblbut, 'p-biblio-but')),
		'p-biblio-id',
		elem.id
	);
	elem.append(biblbut);
};

/**
 * @param {HTMLElement} cont - контейнер с элементов библиографии
 * @returns {BiblioElemNum}
 */
const findBiblios = (cont) => {
	$data(cont, 'p-biblio-cont', '');
	return /**@type {HTMLElement[]} */ (Array.from(cont.children)).reduce(
		(a, e, i) => {
			if (e.id)
				a[e.id] = {
					elem: e,
					num: i + 1,
					cites: [...getCitesById(e.id)],
				};
			if (a[e.id].cites.length) insertBiblioBut(e);
			else
				console.warn(
					`Нет отсылок на элемент библиографии ${a[e.id].num} с id="${
						e.id
					}"`
				);
			return a;
		},
		/**@type BiblioElemNum*/ ({})
	);
};

/**
 * @param {string} id - id элемента библиографии
 * @returns {NodeListOf<HTMLAnchorElement>}
 */
const getCitesById = (id) => {
	return /**@type {NodeListOf<HTMLAnchorElement>} */ (
		$a(`a.${crefbiblio}[href="#${id}"]`)
	);
};

Последний раз редактировалось voraa, 25.05.2023 в 18:21.
Ответить с цитированием