reactjs - Yleiset ominaisuudet Typescript-tyypin tarkistusta varten


Haluan kirjoittaa komponentin, joka vastaanottaa komponentteja ja propseja, ja renderöi injektoimalla mukautettuja propseja

type InjectProps<P> = {
  custom: string
} & P

interface Props<P> {
  component: React.ComponentType<InjectProps<P>>
  componentProps: P
}

class PropInjector<T> extends Component<Props<T>> {
  ...
  render() {
    const GivenComponent = this.props.component
    return (
      // in my case, Wrapper is needed for some reason.
      <Wrapper>
        <GivenComponent {...this.props.componentProps} custom="props" />
      <Wrapper />
    )
  }
}

Kun testaan Input-komponentilla, jonka propsit on määritelty näin,

interface InputProps {
  custom: string
  value: string
  onChange(value: string): void
}
class Input extends Component<InputProps> { ... }

Luulin, että TypeScript voisi päätellä ja tarkistaa tyypit tässä alla olevassa koodissa, mutta se ei antanut virheitä.

render() {
  return (
    // should throw error about not existing Input's required props like value, onChange ....
    // But no error
    <PropInjector component={Input} componentProps={{}} />
  )
}

Kuinka voin saada Typescriptin päättelemään P ja tekemään tyyppitarkistuksen componentPropsin kanssa P käyttäessäni PropInjector?

Vastaus #1

Niin pitkälle kuin tiedän, tämä ei ole tällä hetkellä mahdollista TypeScriptillä. Lopullisessa render()-metodissasi et anna geneeristä arvoa PropInjector-komponentille. Siksi TypeScriptillä ei ole aavistustakaan, mitä T pitäisi olla PropInjector-sisällä.

Kiertotie on määritellä välikomponentti näin:

class InputPropInjector extends PropInjector<InputProps> { }

class Input extends Component<InputProps> {
    render(): JSX.Element {
        return (
            <InputPropInjector component={Input} componentProps={{}} />
        );
    }
}

Tästä on keskusteltu melko paljon, joten toivottavasti parempi ratkaisu on saatavilla tulevaisuudessa.