【发布时间】:2017-07-14 14:55:12
【问题描述】:
我有苹果和梨 - 两者都有 isDecayed 属性:
interface Apple {
color: string;
isDecayed: boolean;
}
interface Pear {
weight: number;
isDecayed: boolean;
}
这两种类型都可以在我的水果篮中(多次):
interface FruitBasket {
apples: Apple[];
pears: Pear[];
}
现在假设我的购物篮是空的:
const fruitBasket: FruitBasket = { apples: [], pears: [] };
现在我们从篮子里随机取出一种:
const key: keyof FruitBasket = Math.random() > 0.5 ? 'apples': 'pears';
const fruits = fruitBasket[key];
当然没有人喜欢腐烂的水果,所以我们只挑选新鲜的:
const freshFruits = fruits.filter((fruit) => !fruit.isDecayed);
不幸的是 Typescript 告诉我:
无法调用类型缺少调用签名的表达式。输入 '((callbackfn: (value: Apple, index: number, array: Apple[]) => any, thisArg?: any) => Apple[]) | ...' 没有兼容的调用签名。
这里出了什么问题 - 仅仅是 Typescript 不喜欢新鲜水果还是这是一个 Typescript 错误?
你可以在官方Typescript Repl自己试试。
【问题讨论】:
-
有什么理由不能用
isDecayed属性扩展一个通用的Fruit接口,然后将fruits 声明为Fruit[]类型? -
奇怪...如果您将
key显式设置为string即const key: string = Math.random() > 0.5 ? 'apples': 'pears';没有错误 -
^ 发生是因为没有明确的索引签名,返回类型将是
any这可以绕过问题。
标签: javascript typescript types