react native - Typescript: onPress-type
Jeg har nettopp overført mitt react-native-prosjekt til TypeScript og har et spørsmål om funksjoner som props
jeg passerer:
<DisplayCardsWithLikes
data={testData}
likes={500}
onPress={() => this.props.navigation.navigate("CardDetailScreen")}
/>
til
type Props = {
onPress: Function
}
const FloatingActionButtonSimple = (props:Props) => {
const {onPress} = props
return (
<View style={styles.containerFab}>
<TouchableOpacity style={styles.fab} onPress={onPress}>
<Icon name="plus" size={16} color={"white"} />
</TouchableOpacity>
</View>
);
};
Feil :
Error, caused by child onPress:
o overload matches this call.
Overload 1 of 2, '(props: Readonly<TouchableOpacityProps>): TouchableOpacity', gave the following error.
Type 'Function' is not assignable to type '(event: GestureResponderEvent) => void'.
Type 'Function' provides no match for the signature '(event: GestureResponderEvent): void'.
Overload 2 of 2, '(props: TouchableOpacityProps, context?: any): TouchableOpacity', gave the following error.
Type 'Function' is not assignable to type '(event: GestureResponderEvent) => void'.ts(2769)
index.d.ts(5125, 5): The expected type comes from property 'onPress' which is declared here on type 'IntrinsicAttributes & IntrinsicClassAttributes<TouchableOpacity> & Readonly<TouchableOpacityProps> & Readonly<...>'
index.d.ts(5125, 5): The expected type comes from property 'onPress' which is declared here on type 'IntrinsicAttributes & IntrinsicClassAttributes<TouchableOpacity> & Readonly<TouchableOpacityProps> & Readonly<...>'
Sammendrag: onPress sendt som prop (er en funksjon). På child-type onPress:Function vises en feil (den ovenfor), onPress:any fungerer derimot. Jeg vet egentlig ikke hvilken type onPress-propen er
Så ikke noe sprøtt, men hvis jeg definerer onPress som en funksjon, vises en feil, så tydeligvis er ikke det riktig type. Vet du hvilken type disse onPress-funksjonene har?
Tusen takk!
Svar #1
Du må definere typen som nedenfor for å bli kvitt typefeilen fra tslint:
type Props {
onPress: (event: GestureResponderEvent) => void
}
ELLER
type Props {
onPress(): void
}
ELLER
type Props {
onPress(params: type): void
}
Svar #2
Den feilmeldingen viser typen som den ville akseptere for funksjonen din som dette:
(event: GestureResponderEvent) => void
Det som er viktig å merke seg er => void som betyr at det forventes en funksjon som ikke returnerer en verdi.
Men denne funksjonen:
() => this.props.navigation.navigate("CardDetailScreen")
returnerer en verdi. Arrow-funksjoner uten {} returnerer resultatet av uttrykket deres.
Løsningen er å legge til {} i tilbakekallingen din slik at funksjonen ikke returnerer noe, noe som vil samsvare med forventet type:
onPress={() => { this.props.navigation.navigate("CardDetailScreen") } }
