Typescript: JSX рддрддреНрд╡ рдкреНрд░рдХрд╛рд░ рдореЗрдВ v3.2.0-rc рдореЗрдВ рдХреЛрдИ рдирд┐рд░реНрдорд╛рдг рдпрд╛ рдХреЙрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдирд╣реАрдВ рд╣реИрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 21 рдирд╡ре░ 2018  ┬╖  27рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: microsoft/TypeScript

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд╕реНрдХрд░рдг: 3.2.0-

рдХреЛрдб

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

рдЕрдкреЗрдХреНрд╖рд┐рддреН рд╡реНрдпрд╡рд╣рд╛рд░:
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 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 рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЗ рдиреЛрдб_рдореЙрдбрд▓ рдпрд╛ рд▓реЙрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдирд╣реАрдВ рдмрдЪрд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЖрдк рд╢рд╛рдпрдж рдХреЙрдореНрдкреЛрдиреЗрдиреНрдЯ рдЯрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд░рд┐рдПрдХреНрдЯ рдЯрд╛рдЗрдк рдХрд╛ рдирд╣реАрдВ

@Kovensky

рдореИрдВрдиреЗ рдирд╡реАрдирддрдо @types/react 16.7.7 рдФрд░ рдХреЛрдИ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ @types/react yarn.lock рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред
рдпрджрд┐ рд╕рдорд╕реНрдпрд╛ @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 ...

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рд╕рдорд╕реНрдпрд╛ рдирдП "рдЕрд╢рдХреНрдд рднреЗрджрднрд╛рд╡рд┐рдпреЛрдВ" рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 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 _similar type_ рд╣реИ, рд▓реЗрдХрд┐рди D рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ

рд░реЗрдкреЛ рдореЗрдВ рдХреЛрдб: https://github.com/layershifter/ts-issue

рд╡реЗ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк const рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред A рдХрд╛ рдкреНрд░рдХрд╛рд░ typeof configEmpty.ElementType , рд▓реЗрдХрд┐рди B рдХрд╛ рдкреНрд░рдХрд╛рд░ 'div' ред let s рдХрд╛ рдЙрдкрдпреЛрдЧ рджреЛрдиреЛрдВ рдкрд░ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рджрд┐рдЦрд╛рдПрдЧрд╛ред

@Kovensky рдХреНрдпрд╛ A рдФрд░ C ? C рдХрд╛рд░реНрдп рдХреНрдпреЛрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬрдмрдХрд┐ A does not have any construct рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ?

рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЙрди рдШрдЯрдХреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ReactType рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЖрдк рдЙрд╕реЗ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЙрдкреНрд╕ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдХреНрдпреЛрдВрдХрд┐ DOM рддрддреНрд╡реЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА { a: string | undefined } рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╡реЗ рд╕рднреА рдХреЛ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди / рд╡рд░реНрдЧ рдШрдЯрдХреЛрдВ рдХреЛ рдЕрднреА рднреА рдЗрд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред

@Kovensky рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рдж the рдЕрдм рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рдореБрджреНрджрд╛ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

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 рдХреА рддреНрд░реБрдЯрд┐ # 28795 рдФрд░ # 28768 рдХрдВрдбреАрд╢рдирд▓ JSX рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред

рд╣рдореНрдо, рдЗрд╕рд▓рд┐рдП рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ ReactType<any> _every рдмрд┐рд▓рд┐рди 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>
}

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред рдЬреИрд╕рд╛ рд╣реИ:

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 рд╕рдВрдХрд▓рди рд╣реЛред

@ рдкреНрд░рдХрд╛рд░ / рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ @ рдкреНрд░рдХрд╛рд░ / рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдФрд░ рдЯрд╛рдЗрдкреЛрдЧреНрд░рд╛рдлреА 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-Componentstype"

@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>

    )

}

рдардВрдбрд╛! рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдХрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд╛рдкрд┐рдд @ рдкреНрд░рдХрд╛рд░ / рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдХреМрди рд╕рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ?

@ericmasiello

рдардВрдбрд╛! рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдХрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд╛рдкрд┐рдд @ рдкреНрд░рдХрд╛рд░ / рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдХреМрди рд╕рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ?

[email protected]
@ рдкреНрд░рдХрд╛рд░ / рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛@16.9.49

рдореИрдВрдиреЗ рдЗрди рджреЛ рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛:

рдорд╛рдорд▓рд╛ рдПрдХ:

.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 /> 
}

рд╕реВ, рдореВрд▓ рд░реВрдк рд╕реЗ, рдЕрдкрдиреЗ рдирд┐рд░реНрдпрд╛рдд, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдпрд╛рдд рдФрд░ рдЖрдпрд╛рдд рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдореБрдЭреЗ рдЕрдкрдиреА рдЕрдВрдЧреНрд░реЗрдЬреА рдкрд░ рдмрд╣реБрдд рдЦреЗрдж рд╣реИ рдФрд░ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдорджрдж рдорд┐рд▓реЗрдЧреАред

рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди рдерд╛:

export type WrapperProps = {
  mainApp: React.ElementType
}

рдиреАрдЙ рдм

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

siddjain picture siddjain  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

seanzer picture seanzer  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Roam-Cooper picture Roam-Cooper  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

fwanicka picture fwanicka  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

uber5001 picture uber5001  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ