错误:可以将类分配给类型“ T”的约束,但是可以使用约束类的其他子类型实例化“ T”

时间:2020-09-02 12:57:05

标签: typescript

我开始说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,而不是DogCat。我不想显式声明类型。

我该如何解决问题? 谢谢

0 个答案:

没有答案