我开始说StackOverflow对此错误消息有很多疑问,但没有一个对我有帮助,只是情况不同。
我正在尝试构建一个接受联合类型 A | B 并返回相应的 A 或 B 的函数。< / p>
一个例子是这个playground:
class Cat {
meow() {}
clone(): Cat {
return new Cat;
}
}
class Dog {
woof() {}
clone(): Dog {
return new Dog;
}
}
type Animal = Cat | Dog;
function clone<T extends Animal>(animal: T): T {
if (animal instanceof Cat) {
animal.meow();
} else if (animal instanceof Dog) {
animal.woof();
}
return animal.clone();
}
但是我收到以下错误:
类型“动物”不可分配给类型“ T”。 “动物”是可分配的 到类型'T'的约束,但是'T'可以用a实例化 约束“动物”的不同子类型。 类型“猫”不可分配给类型“ T”。 “ Cat”可分配给“ T”类型的约束,但可以用约束“ Animal”的其他子类型实例化“ T”。
我希望像这样使用它
const dog = new Dog();
const otherDog = clone(dog);
// otherDog's type is Dog and not Animal
我认为关键字extends
的使用在这里是错误的,因为我不应该扩展联合类型,而要使用联合类型的一部分。但是写:
function clone(animal: Animal): Animal {
然后返回的类型始终为Animal
,而不是Dog
或Cat
。我不想显式声明类型。
我该如何解决问题? 谢谢