gpt4 book ai didi

typescript - 在方法中使用泛型

转载 作者:搜寻专家 更新时间:2023-10-30 21:10:14 25 4
gpt4 key购买 nike

为什么我在返回 popupFactory(...) 方法时收到错误“Type 'AbstractPopup' is not assignable to type T”?请忽略其他错误,这只是一个测试代码,以更好地理解泛型的工作原理。

function popupFactory<T extends AbstractPopup>(popupType: PopupType, data: {}): T 
{
var popup: AbstractPopup;

switch (popupType)
{

case PopupType.ConcretePopup:
{
popup = new ConcretePopup();
break;
}
}

return popup;
}

abstract class AbstractPopup
{
type: PopupType;
}

class ConcretePopup extends AbstractPopup{}

var p = popupFactory<ConcretePopup>(PopupType.ConcretePopup, {});

最佳答案

泛型函数意味着它应该基于传递给它的泛型类型参数来工作。在您的情况下,该方法根据枚举参数而不是通用参数决定返回类型。所以这个方法并不是真正通用的。

编译器提示的原因是,因为你可以传递从 AbstractPopup 派生的任何 T 它不能真正检查你返回的类型是否与您传递给函数的特定 T。考虑以下有效代码:

class OtherConcretePopup extends AbstractPopup{}
var p = popupFactory<OtherConcretePopup>(PopupType.ConcretePopup, {})

该代码是有效的,但是您返回了一个 ConcretePopup,即使返回类型是 OtherConcretePopup

最简单的解决方案是对每种弹出类型的方法进行多次重载:

function popupFactory(popupType: PopupType.OtherConcretePopup, data: {}): OtherConcretePopup
function popupFactory(popupType: PopupType.ConcretePopup, data: {}): ConcretePopup
function popupFactory(popupType: PopupType, data: {}): AbstractPopup
{
var popup: AbstractPopup = null;
switch (popupType)
{
case PopupType.ConcretePopup:
{
popup = new ConcretePopup();
break;
}
}

return popup;
}

或者您可以将构造函数作为参数传递并完全消除对开关的需要,但只有当所有构造函数具有相同数量的参数并且所有的初始化都相同时,这是一个不错的选择:

function popupFactory<T extends AbstractPopup>(popupType: new() => T, data: {}): T
{
var popup = new popupType();
return popup;
}

var p = popupFactory(ConcretePopup, {})

关于typescript - 在方法中使用泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49573890/

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