J'ai des pommes et des poires - les deux ont une isDecayed
attribut :
interface Apple {
color: string;
isDecayed: boolean;
}
interface Pear {
weight: number;
isDecayed: boolean;
}
Et les deux types peuvent se retrouver dans mon panier de fruits (plusieurs fois) :
interface FruitBasket {
apples: Apple[];
pears: Pear[];
}
Supposons pour l'instant que mon panier soit vide :
const fruitBasket: FruitBasket = { apples: [], pears: [] };
Maintenant, nous prenons au hasard une sorte dans le panier :
const key: keyof FruitBasket = Math.random() > 0.5 ? 'apples': 'pears';
const fruits = fruitBasket[key];
Et bien sûr, personne n'aime les fruits pourris, donc nous ne prenons que les frais :
const freshFruits = fruits.filter((fruit) => !fruit.isDecayed);
Malheureusement, Typescript me dit :
Impossible d'invoquer une expression dont le type ne comporte pas de signature d'appel. Type '((callbackfn : (valeur : Pomme, index : nombre, tableau : Pomme[]) => tout, thisArg? : tout) => Pomme[]) | ...' n'a pas de signature d'appel compatible.
Qu'est-ce qui ne va pas ici - est-ce simplement que Typescript n'aime pas les fruits frais ou est-ce un bug de Typescript ?
0 votes
Après avoir essayé Google github.com/Microsoft/TypeScript/issues/7960
1 votes
Une raison pour laquelle vous ne pouvez pas étendre un générique
Fruit
avec l'interfaceisDecayed
et déclare ensuite que les fruits sont de typeFruit[]
?0 votes
Étrange... il n'y a pas d'erreur si vous définissez explicitement l'élément
key
àstring
i.econst key: string = Math.random() > 0.5 ? 'apples': 'pears';
0 votes
^ se produit parce que sans une signature d'index explicite, le type de retour sera
any
ce qui permet de contourner le problème.