IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

TypeScript Discussion :

pourquoi Ts n'arrive pas a "narrow down" le type ?


Sujet :

TypeScript

  1. #1
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 451
    Points : 4 600
    Points
    4 600
    Par défaut pourquoi Ts n'arrive pas a "narrow down" le type ?
    Bonjour,

    etant encore debutant en TS, je ne comprends pas pourquoi TS n'arrive pas a deduire le type apres des test. voici mon exemple
    Code typescript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function test(options:{a:string, b:string}|{}) {
        if(Object.keys(options).length === 0) { return; }
        // a partir de ce moment, TS devrait savoir que ca ne peut pas etre de type {}, et donc qu'on est dans le cas {a:string, b:string}
     
        if(!options.a) { return; }// erreur : a n'existe pas dans {} | {a:string, b:string}. Propriete a n'existe pas dans {}
     
        console.log(options.a);// erreur : a n'existe pas dans {} | {a:string, b:string}. Propriete a n'existe pas dans {}
    }
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  2. #2
    Membre éclairé

    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    412
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2002
    Messages : 412
    Points : 657
    Points
    657
    Par défaut
    Bonjour. Il n'y aura pas un moyen d'éliminer le type car c'est un type compatible avec tous les objets. Autrement dit, une variable de type est aussi une variable de type .

    L'autre point, c'est que ce genre de test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object.keys(options).length === 0
    ne sera de toute manière pas utilisé par le compilateur pour déduire des informations de typage. Il faudrait le mettre dans un type guard.

  3. #3
    Membre éclairé

    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    412
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2002
    Messages : 412
    Points : 657
    Points
    657
    Par défaut
    Voici un exemple en remplaçant le type '{}' par 'Record<string, never>'.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    test({});
    test({ a: 'ab', b: 'cd' });
     
    function test(options:{a:string, b:string} | Record<string, never>) {
        if (isEmptyObject(options)) { return; }
     
        console.log(options.a);
    }
     
    function isEmptyObject(obj: object): obj is Record<string, never> {
        return Object.keys(obj).length === 0;
    }
    Le type 'Record<string, never>' peut je pense servir à représenter un objet dont aucune clé n'existe. Il est aussi possible de donner un nom à cette construction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    type EmptyObject = Record<string, never>;
    … cela dit je n'en ai jamais eu besoin en bientôt 10 ans de programmation en TypeScript donc ce n'est pas un besoin habituel.

  4. #4
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 451
    Points : 4 600
    Points
    4 600
    Par défaut
    ok, merci pour ces explications. je vais aussi plancher sur le code founit
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. pourquoi je n'arrive pas a me connecter?
    Par angelange dans le forum JDBC
    Réponses: 13
    Dernier message: 19/09/2007, 13h35
  2. [Erreur de syntaxe] Pourquoi je n'arrive pas a creer une table
    Par pierrot10 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 25/09/2006, 22h37
  3. [Oracle/ASP.Net] Pourquoi je n'arrive pas à charger oci.dll ?
    Par zakaria_jd dans le forum Accès aux données
    Réponses: 1
    Dernier message: 01/08/2006, 12h25
  4. [C# 2005 Express] Pourquoi je n'arrive pas à l'installer ?
    Par Pierre8r dans le forum Visual Studio
    Réponses: 2
    Dernier message: 30/07/2006, 15h49
  5. Réponses: 4
    Dernier message: 22/05/2006, 11h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo