Typescript: Π’ΠΈΠΏ элСмСнта JSX Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… конструкций ΠΈΠ»ΠΈ сигнатур Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π² v3.2.0-rc

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 21 нояб. 2018  Β·  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 ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ»Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π΅ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ².

EDIT: Π²Ρ‹, вСроятно, Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ComponentType, Π° Π½Π΅ ReactType

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

ΠŸΠΎΡ…ΠΎΠΆΠ΅, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° связана с Π½ΠΎΠ²Ρ‹ΠΌΠΈ измСнСниями "дискриминантов, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NULL". ΠŸΠΎΡ…ΠΎΠΆΠ΅, 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 s ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π° ΠΎΠ±ΠΎΠΈΡ….

@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 ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° # 28795 ΠΈ # 28768 Π½Π° основС условного конструктора JSX.

Π₯ΠΌ, поэтому ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ReactType<any> Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ объСдинСниС _every встроСнных Ρ‚Π΅Π³ΠΎΠ² jsx_ (плюс 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, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ошибка Β«index not foundΒ», ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Π» Π²Ρ‹Π΄Π°Ρ‚ΡŒ, Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»Π°.

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π±Ρ‹Π»Π° ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π° ΠΊΠ°ΠΊ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰Π°ΡΡΡ, ΠΈ Π·Π° послСдний дСнь ΠΏΠΎ Π½Π΅ΠΉ Π½Π΅ Π±Ρ‹Π»ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… дСйствий. Он Π±Ρ‹Π» Π·Π°ΠΊΡ€Ρ‹Ρ‚ для автоматичСского вСдСния хозяйства.

Π’ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ связана. Π£ мСня Π΅ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚:

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

   return <TagName>Woookie</TagName>
}

Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ

error TS2604: JSX element type 'TagName' does not 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 .

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ послСднюю Π²Π΅Ρ€ΡΠΈΡŽ @ types / react ΠΈ @ types / react-dom, ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ» ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π² ΠΌΠ°ΡˆΠΈΠ½ΠΎΠΏΠΈΡΠ½Ρ‹Ρ… тСкстах 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

Π― ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» эту ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ я ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π» default, Π½ΠΎ объявил ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ экспорт ΠΊΠ°ΠΊ named вмСсто default Π² Ρ„Π°ΠΉΠ»Π΅ .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 / response Π²Ρ‹ установили?

@ericmasiello

ΠšΡ€ΡƒΡ‚ΠΎ! ΠšΠ°ΠΊΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Typescript ΠΈ ΠΊΠ°ΠΊΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ @ types / response Π²Ρ‹ установили?

[email protected]
@ Ρ‚ΠΈΠΏΡ‹ / [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 /> 
}

Π˜Ρ‚Π°ΠΊ, Π² основном, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ свой экспорт, экспорт ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚ ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΡΡΡ‹Π»Π°Π΅Ρ‚Π΅ΡΡŒ.

МнС ΠΎΡ‡Π΅Π½ΡŒ Таль, Ρ‡Ρ‚ΠΎ я Π³ΠΎΠ²ΠΎΡ€ΡŽ ΠΏΠΎ-английски, ΠΈ я надСюсь, Ρ‡Ρ‚ΠΎ это ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚.

для мСня Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ:

export type WrapperProps = {
  mainApp: React.ElementType
}

niu b

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ