J'ai un objet tapé comme
interface Asset {
id: string;
}
interface Project {
assets: Array<string> | Array<Asset>;
}
Maintenant, si je lance ce qui suit:
const project: Project = {
assets: [
{id: '1'}.
{id: '2'},
{id: '3'},
{id: '4'}
],
};
project.assets.map((asset: Asset) => asset.id);
Je reçois cette erreur
Impossible d'appeler une expression dont le type n'a pas de signature d'appel. Tapez '((callbackfn: (value: string, index: number, array: string []) => U, thisArg ?: any) => U []) | ((callbackfn: (value: Asset, index: number, array: Asset []) => U, thisArg ?: any) => U []) 'n'a pas de signatures d'appel compatibles.
Cette erreur persiste même si je change le rappel en
project.assets.map((asset: Asset | string) => {console.log(asset)});
Pourquoi cela se produit-il et comment résoudre ce problème?
3 réponses
C'est parce que TS ne peut pas déterminer quel est le type final de votre tableau project.assets
. Vous pouvez appeler la fonction map comme ceci avec une assertion de type et cela fonctionnera:
(project.assets as Asset[]).map((asset: Asset) => asset.id)
Cela ne vous permettra pas non plus d'affirmer son type comme c'est-à-dire number[]
car TS vérifie toujours si votre assertion correspond à votre définition de type.
Vous pouvez changer l'interface de Project en:
interface Project {
assets: Array<string|Asset>;
}
Ou
interface Project<T> {
assets: Array<T>;
}
const project: Project<Asset> = {
assets: [
{id: '1'}.
{id: '2'},
{id: '3'},
{id: '4'}
],
};
project.assets.map((asset: Asset) => asset.id);
Je ne sais pas si c'est possible sans génériques, mais cela fonctionne au moins.
interface Project<T extends string | Asset> {
assets: Array<T>;
}
const project: Project<Asset> = {
assets: [
{id: '1'},
{id: '2'},
{id: '3'},
{id: '4'}
],
};
project.assets.map((asset) => {})
Questions connexes
De nouvelles questions
arrays
Un tableau est une structure de données linéaire ordonnée constituée d'une collection d'éléments (valeurs, variables ou références), chacun identifié par un ou plusieurs index. Lorsque vous posez des questions sur des variantes spécifiques de tableaux, utilisez plutôt les balises associées: [vector], [arraylist], [matrix]. Lorsque vous utilisez cette balise, dans une question spécifique à un langage de programmation, identifiez la question avec le langage de programmation utilisé.