使用本机 Web 组件时出现 Typescript 错误 "Property does not exist on type 'JSX.IntrinsicElements'"
Typescript error "Property does not exist on type 'JSX.IntrinsicElements'" when using native web component
我正在处理一个使用 React 和 Typescript 的项目,但我想开始在我的项目中使用本机 Web 组件以逐步淘汰我的一些 React 组件。
当我尝试在我的某些 JSX 中包含使用 person-info
组件时出现此错误。
Property does not exist on type 'JSX.IntrinsicElements'
我查看了其他一些有这些问题的问题,但其中 none 似乎与本机 Web 组件特别有关。
当我在我的项目中使用我的 Web 组件时,如何让 Typescript 和 React 正常运行?
PersonInfo.mjs
const css = `
<style>
:host([hidden]) { display: none; }
:host {
align-items: center;
display: grid;
font-weight: normal;
grid-gap: var(--spacing-size-a) var(--spacing-size-a);
grid-template-areas:
'picture heading'
'picture sub-heading';
grid-template-columns: auto 1fr;
justify-items: start;
}
div {
grid-area: picture;
}
h1, h2 {
margin: 0;
padding: 0;
}
h1 {
align-self: end;
font-size: var(--l-text-size);
font-weight: normal;
grid-area: heading;
text-transform: capitalize;
}
h2 {
align-self: start;
font-size: var(--m-text-size);
grid-area: sub-heading;
}
ion-icon {
font-size: 56px;
}
</style>
`
const html = `
<div>
<ion-icon name="md-contact"></ion-icon>
</div>
<h1>Heading</h1>
<h2>Sub-heading</h2>
`
class PersonInfo extends HTMLElement {
static get observedAttributes () {
return [
'heading',
'subHeading',
'size'
]
}
constructor () {
super()
this.attachShadow({mode: 'open'})
this.shadowRoot.appendChild(template.content.cloneNode(true))
}
connectedCallback () {
this.shadowRoot.querySelector('h1').innerText = this.getAttribute('heading')
this.shadowRoot.querySelector('h2').innerText = this.getAttribute('subHeading')
}
get heading () {
return this.getAttribute('heading')
}
set heading (newValue) {
this.setAttribute('heading', newValue)
this.shadowRoot.querySelector('h1').innerText = newValue
}
get subHeading () {
return this.getAttribute('subHeading')
}
set subHeading (newValue) {
this.setAttribute('subHeading', newValue)
this.shadowRoot.querySelector('h2').innerText = newValue
}
get size () {
return this.getAttribute('size')
}
set size (newValue) {
this.setAttribute('size', newValue)
}
}
const template = document.createElement('template')
template.innerHTML = `${css}${html}`
window.customElements.define('person-info', PersonInfo)
导入语句
import '../../common/WebComponents/PersonInfo.mjs'
JSX 中的用法
<main>
<person-info
heading='Bruce Wayne'
subHeading="I'M BATMAN!"
/>
</main>
我想出了 here 如何消除这个特定错误。
import * as React from 'react'
declare global {
namespace JSX {
interface IntrinsicElements {
'person-info': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>;
}
}
}
但是,由于我在组件上使用的自定义属性,此后我又遇到了另一个错误。感谢 Shanon 的评论,我也想出了如何解决这个问题,并最终得到了我刚刚导入到我的 App.tsx
文件中的最终代码。
import * as React from 'react'
declare global {
namespace JSX {
interface IntrinsicElements {
'person-info': PersonInfoProps
}
}
}
interface PersonInfoProps extends React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> {
heading: string,
subHeading: string,
size?: string
}
我正在处理一个使用 React 和 Typescript 的项目,但我想开始在我的项目中使用本机 Web 组件以逐步淘汰我的一些 React 组件。
当我尝试在我的某些 JSX 中包含使用 person-info
组件时出现此错误。
Property does not exist on type 'JSX.IntrinsicElements'
我查看了其他一些有这些问题的问题,但其中 none 似乎与本机 Web 组件特别有关。
当我在我的项目中使用我的 Web 组件时,如何让 Typescript 和 React 正常运行?
PersonInfo.mjs
const css = `
<style>
:host([hidden]) { display: none; }
:host {
align-items: center;
display: grid;
font-weight: normal;
grid-gap: var(--spacing-size-a) var(--spacing-size-a);
grid-template-areas:
'picture heading'
'picture sub-heading';
grid-template-columns: auto 1fr;
justify-items: start;
}
div {
grid-area: picture;
}
h1, h2 {
margin: 0;
padding: 0;
}
h1 {
align-self: end;
font-size: var(--l-text-size);
font-weight: normal;
grid-area: heading;
text-transform: capitalize;
}
h2 {
align-self: start;
font-size: var(--m-text-size);
grid-area: sub-heading;
}
ion-icon {
font-size: 56px;
}
</style>
`
const html = `
<div>
<ion-icon name="md-contact"></ion-icon>
</div>
<h1>Heading</h1>
<h2>Sub-heading</h2>
`
class PersonInfo extends HTMLElement {
static get observedAttributes () {
return [
'heading',
'subHeading',
'size'
]
}
constructor () {
super()
this.attachShadow({mode: 'open'})
this.shadowRoot.appendChild(template.content.cloneNode(true))
}
connectedCallback () {
this.shadowRoot.querySelector('h1').innerText = this.getAttribute('heading')
this.shadowRoot.querySelector('h2').innerText = this.getAttribute('subHeading')
}
get heading () {
return this.getAttribute('heading')
}
set heading (newValue) {
this.setAttribute('heading', newValue)
this.shadowRoot.querySelector('h1').innerText = newValue
}
get subHeading () {
return this.getAttribute('subHeading')
}
set subHeading (newValue) {
this.setAttribute('subHeading', newValue)
this.shadowRoot.querySelector('h2').innerText = newValue
}
get size () {
return this.getAttribute('size')
}
set size (newValue) {
this.setAttribute('size', newValue)
}
}
const template = document.createElement('template')
template.innerHTML = `${css}${html}`
window.customElements.define('person-info', PersonInfo)
导入语句
import '../../common/WebComponents/PersonInfo.mjs'
JSX 中的用法
<main>
<person-info
heading='Bruce Wayne'
subHeading="I'M BATMAN!"
/>
</main>
我想出了 here 如何消除这个特定错误。
import * as React from 'react'
declare global {
namespace JSX {
interface IntrinsicElements {
'person-info': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>;
}
}
}
但是,由于我在组件上使用的自定义属性,此后我又遇到了另一个错误。感谢 Shanon 的评论,我也想出了如何解决这个问题,并最终得到了我刚刚导入到我的 App.tsx
文件中的最终代码。
import * as React from 'react'
declare global {
namespace JSX {
interface IntrinsicElements {
'person-info': PersonInfoProps
}
}
}
interface PersonInfoProps extends React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> {
heading: string,
subHeading: string,
size?: string
}