reactjs - Generički Props za provjeru tipa u Typescriptu


Želim napisati komponentu koja će primati komponente i props, i renderirati ih s ubacivanjem prilagođenih propsa

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

Kada testiram s Input čiji su svojstva definirana ovako,

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

Mislio sam da TypeScript može inferirati i provjeriti tipove u ovom kodu ispod, ali nije bacio nikakve pogreške.

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

Kako mogu natjerati Typescript da zaključi P i izvrši provjeru tipa na componentProps s P kada koristim PropInjector?

Odgovor #1

Koliko ja znam, to trenutno nije moguće s TypeScriptom. U vašoj konačnoj render() metodi, ne pružate generičku vrijednost za PropInjector. Stoga TypeScript nema pojma što T treba biti unutar PropInjector.

Zaobilazno rješenje je definirati međukomponentu ovako:

class InputPropInjector extends PropInjector<InputProps> { }

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

Bilo je dosta rasprave o ovome, pa se nadamo da će u budućnosti biti dostupno bolje rješenje.