TypeScript 支持结构类型(也称为鸭子类型),这意味着当类型共享相同的成员时,它们是兼容的 https://www.typescriptlang.org/docs/handbook/type-compatibility.html。你的问题是Apple
and Pear
不要共享其所有成员,这意味着它们不兼容。然而,它们与另一种类型兼容,该类型仅具有isDecayed: boolean
成员。由于结构类型,您不需要继承Apple
and Pear
从这样的界面。
有多种方法可以分配此类兼容类型:
在变量声明期间指定类型
该语句被隐式键入Apple[] | Pear[]
:
const fruits = fruitBasket[key];
您可以简单地在变量声明中显式使用兼容类型:
const fruits: { isDecayed: boolean }[] = fruitBasket[key];
为了获得额外的可重用性,您还可以首先定义类型,然后在声明中使用它(请注意,Apple
and Pear
接口不需要改变):
type Fruit = { isDecayed: boolean };
const fruits: Fruit[] = fruitBasket[key];
转换为操作的兼容类型
给定解决方案的问题在于它改变了fruits
多变的。这可能不是您想要的。为了避免这种情况,您可以在操作之前将数组缩小到兼容的类型,然后将类型设置回与fruits
:
const fruits: fruitBasket[key];
const freshFruits = (fruits as { isDecayed: boolean }[]).filter(fruit => !fruit.isDecayed) as typeof fruits;
或者使用可重复使用的Fruit
type:
type Fruit = { isDecayed: boolean };
const fruits: fruitBasket[key];
const freshFruits = (fruits as Fruit[]).filter(fruit => !fruit.isDecayed) as typeof fruits;
该解决方案的优点是,fruits
and freshFruits
将是类型Apple[] | Pear[]
.