gpt4 book ai didi

TypeScript 泛型 : 'type is not assignable to type T'

转载 作者:搜寻专家 更新时间:2023-10-30 20:40:38 24 4
gpt4 key购买 nike

我创建了一个工厂,它将创建某些类的实例。我想使用泛型来确保返回的所有对象都来自扩展抽象类的子类。

我认为下面显示的 createInstance 方法的逻辑可以描述为“createInstance() 将返回一个 T 类型,它被限制为一个扩展类动物。

如您所见,Lion 扩展了 Animal,但我仍然收到编译器警告 type Lion is not assignable to type T

abstract class Animal {
abstract makeSound(): void;
}

class Bear extends Animal {
public makeSound() {
console.log('growl');
}
}

class Lion extends Animal {
public makeSound() {
console.log('roar');
}
}

function createInstance<T extends Animal>(type: string): T {
switch(type) {
case 'bear':
return new Bear(); // 'type Bear is not assignable to type T'
case 'lion':
return new Lion(); // 'type Lion is not assignable to type T'
}
}

createInstance().makeSound();

我已阅读 TypeScript Generics 的末尾文档:

When creating factories in TypeScript using generics, it is necessary to refer to class types by their constructor functions. For example,

function create<T>(c: {new(): T; }): T {
return new c();
}

但我真的不想尽可能将类构造函数传递给函数,并且想了解为什么我在第一个消息中收到 not assignable to type T 消息地方。

谢谢

最佳答案

如果您的函数总是返回 Lion它的结果类型并不是真正通用的。例如,您可以写 create<Tiger>()你的函数仍然会返回 Lion .真正的泛型函数会返回一个支持泛型参数的值。

正如您发现的那样,您可以将构造函数作为参数传递:

function create<T>(c: {new(): T; }): T {
return new c();
}

或者你可以让你的函数不是通用的,并让它返回一个 AnimalLion .如果您有基于确定返回类型的参数值的逻辑,您可以有更多的重载:

// Public signatures, we tie function parameter values to return value for specific types
function createInstance(type: "Lion"): Lion
function createInstance(type: "Tiger"): Tiger
// Private signature, not visible from outside
function createInstance(type: "Lion" | "Tiger"): Animal {
if(type === "Lion") {
return new Lion();
}
else if(type === "Tiger") {
return new Tiger();
}
}
let tiger = createInstance("Tiger"); // will be typed as Tiger
let lion = createInstance("Lion");// will be typed as Lion
let err = createInstance("Lama");// will be an error since the function does not know how to create a Lama

关于TypeScript 泛型 : 'type is not assignable to type T' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49749663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com