Использование JSX в TypeScript без React

Каков простой способ заставить TypeScript распознавать JSX (особенно в VS Code) без использования React в качестве зависимости? Если нам нужно использовать настраиваемое пространство имен JSX и настраиваемое средство визуализации, то какова ожидаемая форма содержимого этого пространства имен и средства визуализации?

Насколько мне известно, JSX - это просто синтаксический сахар, который преобразуется в вызовы функций (например, React.createElement), поэтому должен быть способ указать, что для преобразования JSX следует использовать другую функцию.

Глядя на выпуск документации для TypeScript 2.8, я вижу, что есть разделы с названиями "Пофайловые фабрики JSX" и "Пространства имен JSX с локальной областью видимости", но я не вижу этих разделов в официальных текущих документах TypeScript. Эти функции устарели?

@ Berr'ita: Это не дубликат. Я специально указал, что хочу использовать TypeScript в VSCode (чтобы сохранить функции intellisense). Другой вопрос касается плагинов babel и сторонних пакетов, которые мне не нужны.

prmph 11.01.2019 11:43
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
3 592
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Компилятор Typescript имеет флаги, которые позволяют указать, как обрабатывается TSX / JSX.

В частности, вы должны указать «--jsx = React» и «--jsxFactory = someModule.yourJsxFactory», а в ваших файлах tsx вы предоставляете свою настраиваемую фабрику, импортируя «someModule», из которого следует экспортировать «yourJsxFactory».

Подробнее об этом на
. Машинопись (параметры компилятора)
и
Машинопись (JSX)

@Kaldestad: Я прочитал эти документы, и у меня все еще есть конкретные вопросы. Если вы можете дать конкретный ответ на мои вопросы, я буду признателен

prmph 11.01.2019 11:12

@prmph Немного странно, что вам нужно указать "--jsx = React", когда вы специально хотите, чтобы jsx обрабатывался НЕ React, но именно так cookie рушится

Ola Næss Kaldestad 11.01.2019 11:25

@prmph Сейчас я добавил некоторые уточнения к своему ответу

Ola Næss Kaldestad 11.01.2019 11:30

@ Kaldestad: Да, бит "jsx:" реагировать " сбивает с толку. Кроме того, это больше, чем объясняется в документации. Например, какова ожидаемая форма типов JSX.IntrinsicElements?

prmph 11.01.2019 11:31

@prmph Может быть, в документации немного непонятно, согласен. Я нашел @ types / react на github хорошим руководством. По сути, он должен предоставлять информацию о типе «официальных» элементов html. Или нет, вы можете полностью опустить его, как указано в документации.

Ola Næss Kaldestad 11.01.2019 11:37

@ Kaldestad: Спасибо за обновление ссылки; первая версия была мертва. Но у меня все еще нет того, что мне нужно. Как заставить JSX-движок распознавать пользовательский компонент, который не является частью внутренних элементов?

prmph 11.01.2019 11:45

@prmph Я не совсем понимаю, что вы имеете в виду, говоря «распознавать нестандартный компонент». Фабрика либо справится, либо не справится со всем, что ей брошено. Самый простой способ разобраться в этом - просто попробовать. Если вам интересно, как создавать типы, относящиеся к пользовательским компонентам, снова обратитесь либо к официальным документам TS, либо к чему-то вроде @ types / react, где все это реализовано и открыто для всех.

Ola Næss Kaldestad 11.01.2019 12:10

@Kaldestad: пожалуйста, посмотрите мою ветку с эстусом ниже, вы поймете, к чему я клоню

prmph 11.01.2019 12:13

@prmph Я это вижу, и вы, по сути, просите нас отладить ваш код или предоставить очень конкретные детали реализации, которые полностью выходят за рамки исходного вопроса. И снова, почему бы не посмотреть response на гитхабе, где все это уже реализовано?

Ola Næss Kaldestad 11.01.2019 12:19

@Kaldestad: Нет, я не прошу вас отлаживать мой код. Я просто использую очень минимальную реализацию, чтобы продемонстрировать недостатки официальной документации. Какая польза от документов, если то, что они содержат, на самом деле не работает или настолько расплывчато, что не позволяет реализовать работающую реализацию?

prmph 11.01.2019 12:24
Ответ принят как подходящий

За это отвечают jsx и jsxFactoryпараметры компилятора.

TypeScript ожидает, что функция, определенная в jsxFactory, будет существовать в области модуля. Обычно для этого требуется импортировать React, потому что по умолчанию для jsxFactory используется React.createElement.

Если компилятор настроен с:

...
"jsx": "react",
"jsxFactory": "h",
...

Тогда должна существовать функция h. Типы, связанные с JSX, должны быть определены для правильной работы проверки типов:

declare namespace JSX {
  interface Element {}
  interface ElementClass {
    render(): any;
  }
  interface IntrinsicElements {
    div: any;
    // ...
  }
}

const h = (Comp: any): any => console.info(`creating ${Comp} element`);

<div/>;

class FooComponent {
  render = () => null;
}

<FooComponent/>;

Спасибо @estus: Означает ли это, что все компоненты, которые вы определяете, должны быть добавлены в структуру JSX.IntrinsicElements? Можете ли вы привести пример определения настраиваемого компонента, который будет распознаваться этой схемой?

prmph 11.01.2019 11:37

Не совсем. IntrinsicElements предназначены для HTML и SVG. Вы можете использовать собственные типы React в качестве отправной точки, github.com/DefinitiTyped/DefinitiTyped/blob/…

Estus Flask 11.01.2019 11:59

Можете ли вы предоставить фрагмент кода настраиваемого нереагирующего компонента, тип которого проверяется TypeScript? Кажется, это лучший способ решить мою проблему.

prmph 11.01.2019 12:03

Хорошо @estus, а как насчет функциональных компонентов? Я пробовал их, и они в основном работают, но иногда возникают какие-то странные ошибки. Например, const FComp = () => <div/> выдает ошибку, а const FComp = () => {return <div/> } - нет.

prmph 11.01.2019 12:10

Также @estus, оценка <FComp /> сама по себе дает ошибку, а let elt = <FComp /> - нет.

prmph 11.01.2019 12:11

Функциональные компоненты должны работать "из коробки". Это не должно вызывать ошибки. Какой код пробовали? Я предполагаю, что вы не ставили точку с запятой между строками. Функция должна возвращать вещь, которая является действительным элементом типа Reat (JSX.Element, null и т. д.). Обратитесь к typescriptlang.org/docs/handbook/jsx.html для справки.

Estus Flask 11.01.2019 12:33

Похоже, github.com/nicojs/typed-html - хороший способ сделать это.

GreeneCreations 05.06.2020 00:45

Другие вопросы по теме