J'ai un composant React; par exemple:
<Component1 onMouseClick={() => function(){}} a={1} b={2} />
L'un des accessoires qu'il accepte est une fonction:
<Component1 onMouseClick={() => void} a={1} b={2} />
Donc, lorsque j'utilise ce composant, je peux faites quelque chose comme ceci:
<Component1 onMouseClick={() => this.DoStuff()} a={1} b={2} />
Mais que se passe-t-il si je veux passer une fonction nulle, pour que la fonction ne fasse rien lors d'un clic de souris; par exemple:
export interface IProps {
a: number,
b: number,
onMouseClick: () => void
}
Typescript me gémit, disant qu'il attend une expression. Je peux déclarer une fonction vide; comme ceci:
export class Component1 extends Component<IProps, IState> {
Y a-t-il une meilleure façon de déclarer une fonction vide? Je ne sais pas non plus pourquoi je peux attribuer la propriété onMouseClick à void dans la définition IProps, mais pas lors de l'utilisation du composant.
5 Réponses :
Essayez
export interface IProps {
a: number,
b: number,
onMouseClick: () => void | null
}
ou
export interface IProps {
a: number,
b: number,
onMouseClick?: () => void
}
La deuxième méthode utilise les types d'union: typescriptlang.org/docs/handbook/advanced-types .html
() => void est un type en ce qui concerne le typographie (et est en fait une erreur de syntaxe en Javascript). Vous devriez essayer () => void 0 qui est une fonction qui retourne
export interface IProps {
a: number,
b: number,
onMouseClick?: () => void // ? makes it optional
}
<Component1 a={1} b={2} /> // no error
ou si vous voulez autoriser null ou être facultatif, modifiez le type de prop pour inclure null , bien que vous ayez besoin d'une vérification supplémentaire dans le composant
<Component1 onMouseClick={() => void 0} a={1} b={2} />
vous pouvez le rendre facultatif
class ... extends React.Component<...>{
static defaultProps = {
onMouseClick: () => null,
}
}
et vous voudrez probablement faire des accessoires par défaut avec l'implémentation par défaut afin que vous n'ayez pas à vérifier si onMouseClick est une fonction à chaque fois que vous l'utilisez p>
export interface IProps {
a: number,
b: number,
onMouseClick?: () => void
}
Le void est un opérateur en JavaScript et il doit être suivi d'une expression. Donc () => void n'est pas une définition de rappel valide. La fonction Noop ressemble à ceci () => {} et peut être utilisée dans jsx comme ceci:
interface IProps {
a: number,
b: number,
onMouseClick?: () => void
}
Mais je préfère rendre `onMouseClick facultatif, c'est beaucoup plus pratique et évidente pour un consommateur du composant
<Component1 onMouseClick={() => {}} a={1} b={2}/>
Je pense que cela peut être utile en tenant compte des linters
<Component1 onMouseClick={() => void undefined} a={1} b={2} />
() => {}?() => voidest un type pour une fonction void, d'où son utilisation dans l'interface, pas réellement une définition de fonction.