TypeScript提供(未指定)泛型类型作为泛型参数

TypeScript提供(未指定)泛型类型作为泛型参数,typescript,typescript-generics,Typescript,Typescript Generics,我希望提供泛型类型作为类型参数,而不首先将其解析为具体类型。换句话说,我正在寻找一种方法来指定从基类继承时可以使用的类型映射函数 示例(不正确)语法,希望能比我解释得更好: 抽象类RunIt{ //此函数的返回类型取决于 //声明实现类的方式上的参数*和*: 运行(o:T):SomeMagicConverter{//(语法错误) 返回这个。handle(o);/(想象这个做了一些更有趣的事情) } 受保护的抽象句柄(o:T):SomeMagicConverter;//(语法错误) } 键入MyM

我希望提供泛型类型作为类型参数,而不首先将其解析为具体类型。换句话说,我正在寻找一种方法来指定从基类继承时可以使用的类型映射函数

示例(不正确)语法,希望能比我解释得更好:

抽象类RunIt{
//此函数的返回类型取决于
//声明实现类的方式上的参数*和*:
运行(o:T):SomeMagicConverter{//(语法错误)
返回这个。handle(o);/(想象这个做了一些更有趣的事情)
}
受保护的抽象句柄(o:T):SomeMagicConverter;//(语法错误)
}
键入MyMagicConverter=TypeIWantToReturn;//MyMagicConverter是通用的
类MyRunIt扩展了RunIt{//,但我们在这里不指定t
// [...]
}
新建MyRunIt()。运行(7);//调用推断T是数字,因此返回TypeIWantToReturn
新建MyRunIt()。运行(“”);//现在T是字符串,所以返回TypeIWantToReturn
另外,我想限制这一点,以保证
SomeMagicConverter扩展SomeBase
。i、 e

抽象类RunIt

关于我希望如何使用它的一个更具体的例子,这里有一个用于带缓存的wrap的基本基类(不完全是我的实际用例,但演示了需要):

接口包装{
包含(其他:T):布尔值;
}
抽象类存储{
private readonly cached=new Map();
受保护抽象应用程序包装(o:T):包装;

wrap(o:T):还不支持Wrapped{/泛型参数(2021年3月)。有关更多信息,请参阅和

但是,您所描述的内容可以使用和实现:

//任何要与RunIt一起使用的转换器都必须添加到转换器中
接口转换器{}
//所有转换器必须实现此接口
接口转换器基{length:number}
//将有效密钥映射到自身,将无效密钥映射到“从不”`
ValidKey型=
转换器[K]扩展转换器基?K:从不;
//包含来自类型扩展ConverterBase的转换器的所有条目
类型约束转换器={
[K]在转换器的键中作为ValidKey]:转换器[K];
};
抽象类RunIt{
运行(o:T):约束转换器[K]{
返回此。处理(o);
}
受保护的抽象句柄(o:T):约束的转换器[K];
}
//重新打开转换器并添加一些转换器
接口转换器{Id:T,Array:Array}
类ArrayRunIt扩展了RunIt{
受保护句柄(o:T){return[o];}
}
//@ts expect错误类型“Id”不满足约束“Array”(2344)
类IdRunIt扩展了RunIt{
受保护句柄(o:T){return o;}
}

这个问题正是我要寻找的。我必须看看你建议的解决方法是否适合我,但这确实是一个有趣的方法。我不知道有可能扩展这样的接口。遗憾的是,通用参数没有真正约束到
ConstrainedConverters
,从而可能意外地使一个对象在某些方法上具有
从不
返回(实际错误与错误相去甚远),但它确实实现了约束它的基本思想。@Dave我解决了延迟错误的问题。我现在没有将无效的转换器映射到
从不
,而是将相应的键映射到
从不
,这将从
约束转换器
中删除整个条目。这反过来会在p为运行它提供一个无效的键。更新的代码也包含了一个例子。