рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд╕реНрдХрд░рдг: 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.
рдпрд╣ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдпрд╛рдж рдХрд░ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк @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_ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдмрд╣реБрдд рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд┐рдпрд╛ рдЬрдм рдореБрдЭреЗ рдХрд░рдирд╛ рдерд╛ рдХрд┐ рдЖрдпрд╛рдд рдкрд░ рдбреЙрдЯ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рдШрдЯрдХ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рдерд╛ред
.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 }
рдиреАрдЙ рдм
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди рдерд╛: