Typescript: JSX μš”μ†Œ μœ ν˜•μ—λŠ” v3.2.0-rcμ—μ„œ ꡬ성 λ˜λŠ” 호좜 μ„œλͺ…이 μ—†μŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2018λ…„ 11μ›” 21일  Β·  27μ½”λ©˜νŠΈ  Β·  좜처: microsoft/TypeScript

TypeScript 버전 : 3.2.0-rc, 3.2.1

μ•”ν˜Έ

import * as React from "react";
import { Component, ReactType} from "react";
function App(props:{component:ReactType}) {
  const Comp: ReactType = props.component
  return (<Comp />)
}

μ˜ˆμƒλ˜λŠ” λ™μž‘ :
TypeScript 3.1.6으둜 μ •μƒμ μœΌλ‘œ 좜λ ₯λ˜μ–΄μ•Όν•©λ‹ˆλ‹€.

μ‹€μ œ 행동 :
TS2604: JSX element type 'Comp' does not have any construct or call signatures.

Bug JSTSX Duplicate

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ‚˜μ—κ²Œ 해결책은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

export type WrapperProps = {
    mainApp: React.ElementType
}

λͺ¨λ“  27 λŒ“κΈ€

μ—¬κΈ°μ—λŠ” λ‚˜λ¨Έμ§€ 였λ₯˜ λ©”μ‹œμ§€κ°€ λˆ„λ½λ˜μ–΄ μžˆμ§€λ§Œ @types/react 의 μ΅œμ‹  버전을 μ‚¬μš©ν•˜κ³  있고 node_modules λ˜λŠ” 잠금 νŒŒμΌμ— 쀑볡 된 λ‚΄μš©μ΄ 남아 μžˆμ§€ μ•Šμ€μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€.

νŽΈμ§‘ : μ•„λ§ˆλ„ ReactType이 μ•„λ‹Œ ComponentType을 μ‚¬μš©ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

λΏ‘λΏ‘

μ΅œμ‹  @types/react 16.7.7 ν•˜κ³  @types/react μ—μ„œ yarn.lock @types/react 쀑볡 ν•­λͺ©μ΄ μ—†λŠ”μ§€ ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.
@types/react μ€‘λ³΅μœΌλ‘œ 인해 λ¬Έμ œκ°€ λ°œμƒν•œ 경우 Duplication of definition ... 였λ₯˜κ°€ λ°˜ν™˜λ©λ‹ˆλ‹€.

"typescript": "^3.1.6" 둜 되 돌리면 μ •μƒμ μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€.

타이프 슀크립트 3.2.1

λ‹€λ₯Έ 예

interface P1 {
  p?: boolean
  c?: string
}

interface P2 {
  p?: boolean
  c?: any // if you replace c with string, error goes away
  d?: any
}

declare var C: React.ComponentType<P1> | React.ComponentType<P2>


const a = <C p={true} /> // element does not have any ...

λ¬Έμ œλŠ” μƒˆλ‘œμš΄ "nullable νŒλ³„"λ³€κ²½κ³Ό κ΄€λ ¨λœ 것 κ°™μŠ΅λ‹ˆλ‹€. tsκ°€ ν•΄λ‹Ή μœ ν˜•μ— λŒ€ν•œ 곡톡 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 찾을 μˆ˜μ—†λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.
λ‹€λ₯Έ 예

interface P1 {
  p?: any
  c?: string // remove this and it's ok
}

interface P2 {
  p?: boolean
}

λΉ„μŠ·ν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. λΉ λ₯Έ 예 :

import * as React from 'react'

//
// Types
//

interface Config<P> {
  ElementType: React.ReactType<P>
}

interface EmptyProps {
}

interface Props {
  a?: string
}

type HProps = {
  configEmpty: Config<EmptyProps>,
  config: Config<Props>
}

//
// Component
//

const H: React.FC<HProps> = ({ config, configEmpty }) => {
  const A: React.ReactType<EmptyProps> = configEmpty.ElementType // assigned
  const B: React.ReactType<EmptyProps> = 'div' // assigned

  const C: React.ReactType<Props> = config.ElementType // assigned
  const D: React.ReactType<Props> = 'div' // in this case assignment failed

  return (
    <div>
      <A/> {/* TS2604: JSX element type 'A' does not have any construct or call signatures. */}
      <B/>

      <C/>
      <D/>
    </div>
  )
}

export default H

A 및 B 의 μœ ν˜• 이 B 및 D μ—λŠ” _ μœ μ‚¬ν•œ μœ ν˜• _이 μžˆμ§€λ§Œ D λŠ” ν• λ‹Ή ν•  수 μ—†μŠ΅λ‹ˆλ‹€ πŸ€”

μ €μž₯μ†Œμ˜ μ½”λ“œ : https://github.com/layershifter/ts-issue

const μ‚¬μš©ν•˜κ³  있기 λ•Œλ¬Έμ— 그렇지 μ•ŠμŠ΅λ‹ˆλ‹€. A 은 typeof configEmpty.ElementType μ΄μ§€λ§Œ B 은 'div' μž…λ‹ˆλ‹€. let μ‚¬μš©ν•˜λ©΄ λ‘˜ λ‹€μ—μ„œ λ™μΌν•œ λ™μž‘μ„ λ³΄μ—¬μ€λ‹ˆλ‹€.

@Kovensky A 및 C μ–΄λ–»μŠ΅λ‹ˆκΉŒ? C μž‘λ™ν•˜μ§€λ§Œ A κ°€ does not have any construct 였λ₯˜λ‘œ μ‹€νŒ¨ν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

그것은 당신이 μ œκ³΅ν•˜λŠ” μ†Œν’ˆμ„λ°›μ„ μˆ˜μ—†λŠ” ꡬ성 μš”μ†Œλ₯Ό μ œμ™Έν•˜λ„λ‘ ReactType μœ ν˜•μ„ κ°œμ„ ν–ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. μ–΄λ–€ DOM μš”μ†Œλ„ { a: string | undefined } 받을 수 μ—†κΈ° λ•Œλ¬Έμ— λͺ¨λ‘ μ œμ™Έλ˜κ³  ν•¨μˆ˜ / 클래슀 ꡬ성 μš”μ†Œ 만 ν• λ‹Ή ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@Kovensky κ°μ‚¬ν•©λ‹ˆλ‹€ πŸ‘ 이제 κ³Όμ œμ— λŒ€ν•œ λ¬Έμ œλŠ” λΆ„λͺ…ν•˜μ§€λ§Œ 이건 μ–΄λ–¨κΉŒμš”?

import * as React from 'react'

//
// Types
//

interface Config<P> {
  ElementType: React.ReactType<P>
}

interface Empty {}
interface Props { a?: string }

type HProps = {
  configEmpty: Config<Empty>,
  config: Config<Props>
}

//
// Component
//

const H: React.FC<HProps> = ({ config, configEmpty }) => {
  const A: React.ReactType<Empty> = configEmpty.ElementType // is React.ReactType<Empty>
  const B: React.ReactType<Empty> = 'div' // is string
  const C: React.ReactType<Props> = config.ElementType // is React.ReactType<Props>

  return (
    <div>
      {/* React.ReactType<Empty> */} <A/> {/* <--- TS2604: JSX element type 'A' does not have any construct or call signatures. */}
      {/* React.ReactType<Empty> */} <B/>
      {/* React.ReactType<Props> */} <C/>
    </div>
  )
}

export default H

A 및 B μ—λŠ” λͺ…λ°±ν•˜κ²Œ μ •μ˜ 된 μœ ν˜•μ΄ λ™μΌν•©λ‹ˆλ‹€. A κ°€ μ‹€νŒ¨ν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? 정말 ν˜Όλž€ μŠ€λŸ¬μ›Œμš”.

@rexpan κ³Ό @goloveychuk 의 였λ₯˜λŠ” 쑰건뢀 JSX μƒμ„±μžλ₯Ό 기반으둜 # 28795 및 # 28768κ³Ό μœ μ‚¬ν•©λ‹ˆλ‹€.

흠, κ·Έλž˜μ„œ λ¬Έμ œλŠ” ReactType<any> κ°€ _every builtin jsx tag _ (+ ComponentType<any> 더해 μ£Όμ§€λ§Œ κ·Έ 뢀뢄은 λ¬Έμ œκ°€λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€)의 합집합을 λ°˜ν™˜ν•˜κ³ , ν•΄λ‹Ή ꡬ성 μš”μ†Œμ˜ μ„œλͺ…이 κ°„λ‹¨ν•˜μ§€ μ•Šλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. λ‹€λ₯Έ λͺ¨λ“  것을 μ™„λ²½ν•˜κ²Œ ν¬ν•¨ν•˜λŠ” μ„œλͺ…이 μ•„λ‹™λ‹ˆλ‹€.) 이것도 μˆ˜μ •ν•˜κΈ° μœ„ν•΄ # 7294에 μ˜μ‘΄ν•©λ‹ˆλ‹€. ν”ŒλŸ¬μŠ€ μΈ‘λ©΄μ—μ„œλ³΄κ³ λ˜λŠ” μ΄λŸ¬ν•œ λͺ¨λ“  JSX 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 데 ν•„μš”ν•œ κΈ°λ³Έ λ³€κ²½ 사항은 λ™μΌν•©λ‹ˆλ‹€.

μ»¨ν…μŠ€νŠΈλ₯Ό μœ„ν•΄ λ‹€μŒκ³Ό 같은 μœ ν˜•μ„ 효과적으둜 μ œμ‘°ν•©λ‹ˆλ‹€.

declare const JsxSigs: {[K in keyof JSX.IntrinsicElements]: ((props: JSX.IntrinsicElements[K]) => JSX.Element)}[keyof JSX.IntrinsicElements];

μ΄λŠ” μˆ˜λ§Žμ€ 고유 μ„œλͺ…μ˜ μ‘°ν•©μœΌλ‘œ λλ‚©λ‹ˆλ‹€.

λ‚΄κ°€ λͺ¨λ“  λ‚΄μž₯ jsx νƒœκ·Έμ˜ ν•©μ§‘ν•©μœΌλ‘œ λ³€κ²½ν•˜κΈ° μ „μ—λŠ” _just_ string | ComponentType<any> μ˜€λŠ”λ°, 더 λ‚˜λΉ΄μŠ΅λ‹ˆλ‹€.

예, 특히 3.2 μ΄μ „λΆ€ν„°λŠ” νƒœκ·Έμ— string μœ ν˜•μ΄ 쑰용히 _disabled_ typecheckerμž…λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ λ°œν–‰ν•΄μ•Όν–ˆλ˜ "인덱슀λ₯Ό 찾을 수 μ—†μŒ"였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

이 λ¬Έμ œλŠ” μ€‘λ³΅μœΌλ‘œ ν‘œμ‹œλ˜μ—ˆμœΌλ©° λ§ˆμ§€λ§‰ λ‚ μ—λŠ” ν™œλ™μ΄ μ—†μ—ˆμŠ΅λ‹ˆλ‹€. μžλ™ μ²­μ†Œλ₯Ό μœ„ν•΄ νμ‡„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

κ΄€λ ¨μ΄μžˆμ„ μˆ˜μžˆλŠ” λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€. λ‹€μŒ ꡬ성 μš”μ†Œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

function MaybeLabel(props: { useLabel: boolean }) {
   const { useLabel } = props;
   const TagName = useLabel ? 'label' : 'div';

   return <TagName>Woookie</TagName>
}

결과적으둜

error TS2604: JSX element type 'TagName' does μ•„λ‹˜ have any construct or call signatures.

λ™μ•ˆ

function MaybeLabel2(props: { useLabel: boolean }) {
   const { useLabel } = props;
   const TagName = useLabel ? 'span' : 'div';

   return <TagName>Woookie</TagName>
}

typescript μ»΄νŒŒμΌλŸ¬μ—μ„œ μ™„μ „νžˆ ν—ˆμš©λ©λ‹ˆλ‹€. κ·ΈλŒ€λ‘œ:

export function MaybeLabel3(props: { useLabel: boolean }) {
    const { useLabel } = props;
    const TagName = useLabel ? 'label' : 'div';

    return React.createElement(TagName, 'Wookie')
}

μœ μΌν•œ μ°¨μ΄λŠ” μ–΄λ””μ—μ„œ MaybeLabel2 λ‚΄κ°€ μ‚¬μš©ν•˜κ³  μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€ span λŒ€μ‹  label (μ‚¬μš© span λŒ€μ‹  div 도 κ°€λŠ₯ 보인닀 ). MaybeLabel3 λŠ” μ •ν™•νžˆ MaybeLabel μ»΄νŒŒμΌν•˜λŠ” 것과 κ°™μ•„μ•Όν•˜κΈ° λ•Œλ¬Έμ— 더 μ΄μƒν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€.

μ΅œμ‹  λ²„μ „μ˜ @ types / react 및 @ types / react-dom을 μ‚¬μš©ν•˜κ³  typescript 3.2.1, 3.2.2 및 3.3.0-dev.20181219μ—μ„œ 문제λ₯Ό ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. 3.1.6μ—μ„œλŠ” λͺ¨λ‘ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€ (예제 쀑 μ–΄λŠ 것도 였λ₯˜λ₯Ό μƒμ„±ν•˜μ§€ μ•ŠμŒ).

λ‚˜μ—κ²Œ 해결책은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

export type WrapperProps = {
    mainApp: React.ElementType
}

@ TacB0sS μžμ„Ένžˆ μ„€λͺ… ν•΄μ£Όμ„Έμš”.

μŠ€λ ˆλ“œλ₯Ό μ˜€ν•΄ν–ˆμ„ μˆ˜λ„ μžˆμ§€λ§Œ jsx μš”μ†Œμ— λŒ€ν•œ μ°Έμ‘°λ₯Ό λ‹€λ₯Έ jsx μš”μ†Œμ— μ „λ‹¬ν•˜κ³  μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€.

export const AppWrapper = hot(module)((props: WrapperProps) => {

    const MainApp = props.mainApp;
    if (!MainApp)  // <-- JSX elements MUST start with upper case!!
        throw new ImplementationMissingException("mainApp was not specified!!");

    return (
        <Router history={BrowserHistoryModule.getHistory()}>
            <MainApp prop1={"value"}/>
        </Router>)
});

ν•¨κ»˜ :

export type WrapperProps = {
    mainApp: React.ElementType<{prop1:string}>
}

@ TacB0sS μ €μ—κ²Œ μ£Όμš” νŠΈλ¦­μ€ if 쑰건을 μΆ”κ°€ν•˜λŠ” 것이 μ—ˆμŠ΅λ‹ˆλ‹€. React.ComponentType λ˜λŠ” React.ElementType μ‚¬μš© μ—¬λΆ€λŠ” μ€‘μš”ν•˜μ§€ μ•Šμ€ 것 κ°™μŠ΅λ‹ˆλ‹€.

이 κ²°κ³Όλ₯Ό μ΄ν•΄ν–ˆλŠ”μ§€ 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. ν•΄κ²°ν•  μˆ˜μ—†λŠ” μœ μ‚¬ν•œ 였λ₯˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. λ‚΄ μ‚¬μš© μ‚¬λ‘€λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

// Logo.tsx

import classNames from 'classnames';

interface Props extends React.HTMLAttributes<HTMLElement> {
  tag?: React.ReactType;
}

const Logo: React.SFC<Props> = props => {
  const { tag: Tag = 'div', className, ...rest } = props;
  return (
    <Tag
      className={classNames(styles.logo, className)}
      {...rest}
      dangerouslySetInnerHTML={{ __html: logo }}
    />
  );
};

그런 λ‹€μŒ λ‹€λ₯Έ ꡬ성 μš”μ†Œμ—μ„œ λ‹€μŒκ³Ό 같이 μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

const Header: React.SFC<{}> = () => {
  return (
    <div>
      <Logo tag="h1" aria-label="Syn By Design: Eric Masiello's Portfolio" />
      Header online
    </div>
  );
};

컴파일러λ₯Ό μ‹€ν–‰ν•  λ•Œμ΄ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

components/Logo.tsx:13:6 - error TS2604: JSX element type 'Tag' does not have any construct or call signatures.

13     <Tag
        ~~~


Found 1 error.

이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 방법에 λŒ€ν•œ 아이디어가 μžˆμŠ΅λ‹ˆκΉŒ?

Component λŒ€μ‹  ComponentClass

기본값을 κ°€μ Έ μ™”μ§€λ§Œ ν•΄λ‹Ή 내보내기λ₯Ό .d.ts νŒŒμΌμ—μ„œ κΈ°λ³Έκ°’ λŒ€μ‹  μ΄λ¦„μœΌλ‘œ μ„ μ–Έν–ˆκΈ° λ•Œλ¬Έμ—μ΄ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

여기에 μΆ”κ°€ν•˜κ³  μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€. 이것이 이미 μ–ΈκΈ‰λ˜μ—ˆλŠ”μ§€ ν™•μ‹€ν•˜μ§€ μ•Šμ§€λ§Œ 고용자 μ£Όλ¬Έ ꡬ성 μš”μ†Œλ₯Ό μˆ˜ν–‰ν•˜λŠ” 경우 React.ComponentType μœ ν˜•μ„ μ‚¬μš©ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

. " https://flow.org/en/docs/react/types/#toc -react-componenttype"

@ericmasiello λ™μ μœΌλ‘œ μ „λ‹¬λ˜λŠ” ꡬ성 μš”μ†Œμ— React.ElementType λ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. λ‚΄ μ‚¬μš© μ‚¬λ‘€λŠ” 기본적으둜 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

type Props = {
    heading: React.ElementType
}
const Header: FC<Props> = props => {
    const Header = props.heading ?? 'h2';
    return (
        <Header className="some-class"><children /></Header>
    )
}

@ericmasiello λ™μ μœΌλ‘œ μ „λ‹¬λ˜λŠ” ꡬ성 μš”μ†Œμ— React.ElementType λ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. λ‚΄ μ‚¬μš© μ‚¬λ‘€λŠ” 기본적으둜 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

type Props = {

    heading: React.ElementType

}

const Header: FC<Props> = props => {

    const Header = props.heading ?? 'h2';

    return (

        <Header className="some-class"><children /></Header>

    )

}

λ©‹μžˆλŠ”! μ–΄λ–€ λ²„μ „μ˜ Typescript와 μ–΄λ–€ λ²„μ „μ˜ @ types / reactλ₯Ό μ„€μΉ˜ ν–ˆμŠ΅λ‹ˆκΉŒ?

μ•ˆλ…•ν•˜μ„Έμš”.

λ©‹μžˆλŠ”! μ–΄λ–€ λ²„μ „μ˜ Typescript와 μ–΄λ–€ λ²„μ „μ˜ @ types / reactλ₯Ό μ„€μΉ˜ ν–ˆμŠ΅λ‹ˆκΉŒ?

[email protected]
@ types / [email protected]

λ‹€μŒ 두 가지 쀑 ν•˜λ‚˜λ₯Ό μˆ˜ν–‰ν•˜μ—¬μ΄ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

사둀 1 :

.d.ts 파일 :

declare module "foo" {
   interface PropFoo {
      propy: string;
   }

   class MyTypedComponent extends React.Component<PropFoo> { }
}

λ°˜μ‘ :

import MyTypedComponent from "foo";

function AnotherComponent() {

   /* Notice in here we have to use the dot operator and reference the component */
   return <MyTypedComponent.MyTypedComponent /> 
}

μƒˆλ‘œ μž…λ ₯ 된 ꡬ성 μš”μ†Œλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ _MyTypedComponent.MyTypedComponent_λ₯Ό μž‘μ„±ν•΄μ•Όν•©λ‹ˆλ‹€. 이것은 μ–΄λ–€ μ‚¬λžŒλ“€μ—κ²ŒλŠ” λΆ„λͺ… ν•  수 μžˆμ§€λ§Œ, κ°€μ Έ μ˜€κΈ°μ— λ„νŠΈ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜κ³  ꡬ성 μš”μ†Œλ₯Ό μ°Έμ‘°ν•˜λŠ” 것이 μ „λΆ€ μ˜€μ„ λ•Œ λ§Žμ€ μ‹œκ°„μ„ λ‚­λΉ„ν–ˆμŠ΅λ‹ˆλ‹€.

사둀 2 [사둀 1을 μž‘μ„±ν•˜λŠ” 또 λ‹€λ₯Έ 방법] :

.d.ts 파일 :

declare module "foo" {
   interface PropFoo {
      propy: string;
   }

   export default class MyTypedComponent extends React.Component<PropFoo> { } //Notice the export default in here
}

λ°˜μ‘ :

import MyTypedComponent from "foo";

function AnotherComponent() {

   /* Since this component is default exported, no need to use the dot operator */
   return <MyTypedComponent /> 
}

Soo, 기본적으둜 내보내기, κΈ°λ³Έ 내보내기 및 κ°€μ Έ 였기λ₯Ό ν™•μΈν•˜κ³  μ˜¬λ°”λ₯΄κ²Œ μ°Έμ‘°ν•˜κ³  μžˆλŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€.

제 μ˜μ–΄μ— λŒ€ν•΄ 유감이며 도움이 λ˜μ—ˆκΈ°λ₯Ό λ°”λžλ‹ˆλ‹€.

λ‚˜μ—κ²Œ 해결책은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

export type WrapperProps = {
  mainApp: React.ElementType
}

niu b

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰