reactjs - Hvordan erklære TypeScript statisk metode fra React funksjonell komponent
Jeg trenger å referere til statiske metoder fra min funksjonelle komponent i React. Jeg har laget et lite eksempel her på hva jeg ønsker å gjøre (det fungerer i JavaScript). Feilen jeg får er på linje 10 const x =...
TS2339: Egenskapen 'GetMyArray' eksisterer ikke på typen 'FunctionComponent'.
import React, {FunctionComponent} from 'react';
interface Props {
isLoading?: boolean,
}
const Speakers : FunctionComponent<Props> = ({isLoading}) => {
if (isLoading) {
const x = Speakers.GetMyArray();
return (
<div>{JSON.stringify({x})}</div>
);
} else {
return <div></div>;
}
};
Speakers.GetMyArray = () => {
return [1,2,3,4]
};
export default Speakers
Svar #1
Dette ville vært enklere å gjøre ved å bruke en klassekomponent siden static-funksjonene og typen på egenskapene kan utledes i klasse-definisjoner.
class Speakers extends React.Component<Props> {
static GetMyArray = () => [1, 2, 3, 4]
render() {
const { isLoading } = this.props
if (isLoading) {
const x = Speakers.GetMyArray(); // works great
return (
<div>{JSON.stringify({x})}</div>
);
} else {
return <div></div>;
}
}
}
Når det er sagt, kunne du gjerne gjøre det ved å utvide React.SFC eller bruke en skjæringstype:
const Speakers: React.SFC<Props> & { GetMyArray?: () => number[]; } = (props) => {
const { isLoading } = props
if (isLoading) {
const x = Speakers.GetMyArray!(); // works, sorta
return (
<div>{JSON.stringify({x})}</div>
);
} else {
return <div></div>;
}
}
Du må merke GetMyArray som valgfri fordi du ikke kan definere den samtidig som du definerer funksjonen, så du må bruke en !-operator (eller sjekke at funksjonen finnes) når du kaller den statiske funksjonen. ! i Speakers.GetMyArray!(); forteller typekontrolløren at du vet hva du gjør og at GetMyArray faktisk ikke er undefined. Se her for å lese om ikke-null-assertjonsoperatoren.
Oppdater
Jeg så ikke at det å bruke React.FC nå er den foretrukne måten å bruke funksjonskomponenter på siden funksjonskomponenter ikke lenger kan betraktes som statsløse.
Hvis du kan klare deg med bare å bruke const Speakers=(props: Props) => ..., kan det å oppgradere TypeScript til 3.1 være ditt beste alternativ!
Svar #2
Mitt svar er ikke helt nøyaktig på spørsmålet ditt. Men jeg tror det vil være nyttig for noen som ønsker å legge til en statisk komponent til funksjonskomponenten.
import React from 'react';
import { Text } from 'react-native';
import Group, { RadioButtonGroupProps } from './Group';
type RadioButtonType = {
text: string,
};
interface StaticComponents {
Group?: React.FC<RadioButtonGroupProps>
}
const RadioButton: React.FC<RadioButtonType> & StaticComponents =
({ text }) => (<Text>{text}</Text>);
RadioButton.Group = Group;
export default RadioButton;
Husk konfigurasjon som dette hvis du vil import React from 'react' direkte i stedet for import * as React from 'react'
Prestasjon:
