


Confusion sur l'inférence de type dactylographié: Pourquoi les définitions des types de valeur de retour des quatre fonctions sont-elles les mêmes et comment éviter les erreurs de type dans le scénario de type Union?
Explorez profondément les subtilités de l'inférence de type dactylographié: l'équivalence de la définition du type de valeur de retour des quatre fonctions et la sécurité du type sous le type Union
Cet article analyse profondément le mécanisme d'inférence du type de typeScript, explique comment les définitions de type de fonction apparemment différentes peuvent obtenir le même résultat et résout les erreurs de type dans le scénario de type conjoint.
Tout d'abord, nous observons quatre types de définitions getReturnType
:
Tapez getreTurnType1<t> = T s'étend (... args: jamais) => inférer r? R: Jamais; Tapez getreTurnType2<t> = T s'étend (... args: jamais []) => inférer r? R: Jamais; Tapez getreTurnType3<t> = T s'étend (... args: tout []) => inférieur r? R: Jamais; Tapez getreTurnType4<t> = T s'étend (... args: tout) => inférieur r? R: Jamais;</t></t></t></t>
Les quatre définitions de type sont conçues pour extraire le type de valeur de retour à partir du type de fonction. Bien que les types de paramètres ( never
, never[]
, any[]
, any
) soient différents, ils n'ont aucun effet sur le résultat de l'inférence du type R
de retour dans le type d'inférence. Le mot clé extends
se concentre sur la structure des types de fonctions, et non sur les types spécifiques de paramètres. Tant que le type de fonction correspond, infer R
peut déduire correctement le type de valeur de retour. Par conséquent, ces quatre définitions sont en fait équivalentes.
Ensuite, nous analysons un morceau de code qui montre les erreurs de type qui peuvent se produire lorsque le type d'union et le type conditionnel sont combinés:
Type d'accessoires<t extends major rescategorylabel> = { Étiquettes: t []; SetSelect: (Index: numéro, étiquette: t étend majeur? Major: RescategoryLabel) => void; xxx: tout; // D'autres attributs sont omis}; const changeselect = ( Index: numéro, Étiquette: Major | RescategoryLabel, E: react.Mousevent<htmlanchorelement> | React.touchevent<htmlanchorelement> ) => { setSelect (index, label); activeTaBtocentter (e.CurrentTarget comme htmlement); };</htmlanchorelement></htmlanchorelement></t>
Il y a un problème avec l'inférence de type de l' label
paramètre de fonction setSelect
dans la définition de type Props
. Le type conditionnel T extends Major ? Major : ResCategoryLabel
tente de déterminer le type d' label
en fonction du type de T
Cependant, puisque T
est un type conjoint de Major | ResCategoryLabel
, lorsque le type réel de T
est inconnu, le compilateur ne peut pas déterminer si T
est Major
ou ResCategoryLabel
, ce qui entraîne l'échec de label
. Le problème n'est pas le type conditionnel lui-même, mais son application dans le contexte du type d'union.
La solution consiste à utiliser Major | ResCategoryLabel
directement comme type d' label
:
Type d'accessoires<t extends major rescategorylabel> = { Étiquettes: t []; SetSelect: (Index: numéro, étiquette: Major | RescategoryLabel) => void; xxx: tout; // D'autres attributs sont omis};</t>
De cette façon, les types de paramètres de setSelect
sont clairs, évitant les erreurs de type et améliorant la lisibilité et la maintenabilité du code. Cela reflète la nécessité d'abandonner le contrôle de type raffiné apporté par des types conditionnels lorsqu'il s'agit de types de joints en échange de définitions de type plus claire et plus sûres.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds











Dépannage et solutions au logiciel de sécurité de l'entreprise qui fait que certaines applications ne fonctionnent pas correctement. De nombreuses entreprises déploieront des logiciels de sécurité afin d'assurer la sécurité des réseaux internes. ...

Les étapes suivantes peuvent être utilisées pour résoudre le problème que Navicat ne peut pas se connecter à la base de données: vérifiez la connexion du serveur, assurez-vous que le serveur s'exécute correctement, l'adresse et le port et le pare-feu autorise les connexions. Vérifiez les informations de connexion et confirmez que le nom d'utilisateur, le mot de passe et les autorisations sont corrects. Vérifiez les connexions réseau et dépannez les problèmes de réseau tels que les défaillances du routeur ou du pare-feu. Désactiver les connexions SSL, qui peuvent ne pas être prises en charge par certains serveurs. Vérifiez la version de la base de données pour vous assurer que la version NAVICAT est compatible avec la base de données cible. Ajustez le délai d'expiration de la connexion et pour les connexions distantes ou plus lentes, augmentez le délai d'expiration de la connexion. D'autres solutions de contournement, si les étapes ci-dessus ne fonctionnent pas, vous pouvez essayer de redémarrer le logiciel, à l'aide d'un pilote de connexion différent ou de consulter l'administrateur de la base de données ou l'assistance officielle NAVICAT.

Redis Memory Soaring comprend: un volume de données trop important, une mauvaise sélection de structure de données, des problèmes de configuration (tels que les paramètres maxmemory trop petits) et des fuites de mémoire. Les solutions incluent: la suppression des données expirées, utiliser la technologie de compression, sélectionner les structures appropriées, ajuster les paramètres de configuration, vérifier les fuites de mémoire dans le code et surveiller régulièrement l'utilisation de la mémoire.

Problèmes d'autorisations et solutions pour l'installation de Minio dans le système CentOS lors du déploiement de Minio dans l'environnement CentOS, les problèmes d'autorisation sont des problèmes courants. Cet article présentera plusieurs problèmes d'autorisation courants et leurs solutions pour vous aider à terminer l'installation et la configuration de Minio en douceur. Modifiez le compte et le mot de passe par défaut: vous pouvez modifier le nom d'utilisateur et le mot de passe par défaut en définissant les variables d'environnement MINIO_ROOT_USER et MINIO_ROOT_PASSWORD. Après modification, le redémarrage du service Minio prendra effet. Configurer les autorisations d'accès au seau: la définition du seau en public entraînera une traction vers le répertoire, ce qui représente un risque de sécurité. Il est recommandé de personnaliser la stratégie d'accès au seau. Vous pouvez utiliser Minio

Problèmes et solutions courants pour la configuration du système de fichiers distribué HADOOP (HDFS) sous CentOS lors de la création d'un cluster HADOOPHDFS sur CentOS, certains erreurs de configurations courantes peuvent entraîner une dégradation des performances, une perte de données et même le cluster ne peut pas démarrer. Cet article résume ces problèmes courants et leurs solutions pour vous aider à éviter ces pièges et à assurer la stabilité et le fonctionnement efficace de votre cluster HDFS. Erreur de configuration du rack-Aware: Problème: les informations de rack-Aware ne sont pas configurées correctement, ce qui entraîne une distribution inégale des répliques de blocs de données et l'augmentation de la charge du réseau. SOLUTION: Vérifiez la configuration du rack-Aware dans le fichier hdfs-site.xml et utilisez HDFSDFSADMIN-PRINTTOPO

VS Code peut fonctionner sur Windows 8, mais l'expérience peut ne pas être excellente. Assurez-vous d'abord que le système a été mis à jour sur le dernier correctif, puis téléchargez le package d'installation VS Code qui correspond à l'architecture du système et l'installez comme invité. Après l'installation, sachez que certaines extensions peuvent être incompatibles avec Windows 8 et doivent rechercher des extensions alternatives ou utiliser de nouveaux systèmes Windows dans une machine virtuelle. Installez les extensions nécessaires pour vérifier si elles fonctionnent correctement. Bien que le code VS soit possible sur Windows 8, il est recommandé de passer à un système Windows plus récent pour une meilleure expérience de développement et une meilleure sécurité.

PHPMyAdmin peut être utilisé pour créer des bases de données dans des projets PHP. Les étapes spécifiques sont les suivantes: Connectez-vous à PhpMyAdmin et cliquez sur le bouton "Nouveau". Entrez le nom de la base de données que vous souhaitez créer et notez qu'il est conforme aux règles de dénomination MySQL. Définissez des ensembles de caractères, tels que UTF-8, pour éviter les problèmes brouillés.

La fragmentation de la mémoire redis fait référence à l'existence de petites zones libres dans la mémoire allouée qui ne peut pas être réaffectée. Les stratégies d'adaptation comprennent: Redémarrer Redis: effacer complètement la mémoire, mais le service d'interruption. Optimiser les structures de données: utilisez une structure plus adaptée à Redis pour réduire le nombre d'allocations et de versions de mémoire. Ajustez les paramètres de configuration: utilisez la stratégie pour éliminer les paires de valeurs clés les moins récemment utilisées. Utilisez le mécanisme de persistance: sauvegardez régulièrement les données et redémarrez Redis pour nettoyer les fragments. Surveillez l'utilisation de la mémoire: découvrez les problèmes en temps opportun et prenez des mesures.
