reactjs - Begränsa tillåtna barn i React TypeScript


Att använda TypeScript i ett React-projekt, finns det något sätt att införa vissa begränsningar på de tillåtna barnen av en komponent? Kompileringstid är att föredra, men körtid kan fortfarande vara användbar.

I mitt fall har jag en komponent, kalla den <ClickTracker>, och den förväntar sig ett enda barn med en callback-prop onClick och den lägger till extra funktionalitet till callbacken (spårar klicket i ett externt bibliotek).

Detta fungerar utmärkt så länge barnet inuti en <ClickTracker> faktiskt använder en onClick-egenskap (alla HTML-element implementerar detta, till exempel), men misslyckas tyst annars.

Till exempel fungerar detta:

<ClickTracker>
  <div>Hello</div>
</ClickTracker>

Men detta fungerar inte:

class Hello extends Component<{}, {}> {
  render() {
    return <div>Hello</div>
  } 
}

<ClickTracker>
  <Hello />
</ClickTracker>

Men detta fungerar eftersom det skickar vidare onClick till ett HTML-element:

class Hello extends Component<{onClick: MouseEventHandler}, {}> {
  render() {
    return <div onClick={this.props.onClick}>Hello</div>
  } 
}

<ClickTracker>
  <Hello />
</ClickTracker>

Som du kan se skulle jag vilja ha viss säkerhet kring vad som kan gå in i <ClickTracker> baserat på barnens egenskaper. Eller om det finns ett annat sätt detta kan göras på.

Svar #1

Det finns för närvarande inget möjligt sätt att upprätthålla typningen av children med TypeScript.

Det finns mer information i detta nummer.

Svar #2

Eller om det finns ett annat sätt att göra detta på

Klickhändelser bubblar upp om inte någon komponent stoppade spridningen (inte standardbeteendet för inbyggda komponenter). Så du kan:

<div onClick={()=>alert('still noted')}>
  <Hello />
</div>

Och den diven är din ClickTracker 🌹