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:
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?
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()
];
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*)
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 };
}