web-dev-qa-db-fra.com

TypeScript ne fonctionne pas

J'ai des problèmes avec l'opérateur d'instanceof et cela ne semble pas fonctionner. Voici une partie de mon code:

        const results = _.map(items, function(item: Goal|Note|Task, index: number) { 
            let result = {};
            if (item instanceof Goal) {
                result = { id: index, title: item.name };
            } else if (item instanceof Note) {
                result = { id: index, title: item.content.text };
            } else if (item instanceof Task) {
                result = { id: index, title: item.name };
            }

            console.log(item);
            console.log(item instanceof Goal);
            console.log(item instanceof Note);
            console.log(item instanceof Task);

            return result; 
        });

Tous mes journaux disent faux, voici à quoi ressemble la console:

 No type matched

Aucun d’entre eux ne correspond, bien qu’il soit explicite que seuls les 3 types seraient possibles. Vous pouvez également voir l'objet lui-même avec un nom de type de Goal, je ne comprends donc pas pourquoi il ne correspond pas à instanceof Goal.

Des idées?

5
AnimaSola

instanceof ne renverra true que si elle correspond à la fonction ou à la classe à partir de laquelle elle a été construite. La item est une simple Object.

const a = { a: 1 } // plain object
console.log(a);

// {a:1}                 <-- the constructor type is empty
//   a: 1
//   __proto__: Object   <-- inherited from

a instanceof A         // false because it is a plain object
a instanceof Object    // true because all object are inherited from Object

S'il est construit en utilisant une fonction constructeur ou une classe, alors instanceof fonctionnera comme prévu:

function A(a) {
    this.a = a;
}

const a = new A(1);    // create new "instance of" A
console.log(a);

// A {a:1}               <-- the constructor type is `A`

a instanceof A         // true because it is constructed from A
a instanceof Object    // true

Si Goal est une Interface, il ne vérifiera que la structure de l'objet, pas son type. Si Goal est un constructeur, il doit alors renvoyer true pour les contrôles instanceof.

Essayez quelque chose comme:

// interface Goal {...}
class Goal {...}        // you will have to change the way it works.

items = [
   new Goal()
];
11
Gopikrishna S

Essayez d'instancier l'objet avec un constructeur. Il m'est arrivé la même chose parce que je me moquais manuellement de l'objet à des fins de test. Si vous créez l'élément comme dans l'exemple suivant, cela devrait fonctionner:

item: Goal = new Goal(*item values*)
0
Lucia

Vous pouvez également utiliser des types de gardes à votre avantage:

https://basarat.gitbooks.io/TypeScript/docs/types/typeGuard.html

https://www.typescriptlang.org/docs/handbook/advanced-types.html

Par exemple, si vous utilisez un garde de type littéral pour votre classe:

class Goal {
 type: 'goal'
...
}

alors le contrôle est aussi simple que:

if (item.type === 'goal') {
}

Ou vous pourriez écrire vos propres types de gardes:

function isNote(arg: any): arg is Note {
    // because only your Note class has "content" property?
    return arg.content !== undefined;
}

if (isNote(item)) {
    result = { id: index, title: item.content.text };
}
0
AFD