方法的泛型类型取决于TypeScript中类的泛型类型
我有一个可以用伪代码表示的用例,如下所示:方法的泛型类型取决于TypeScript中类的泛型类型,typescript,generics,types,Typescript,Generics,Types,我有一个可以用伪代码表示的用例,如下所示: class Gen<T> { public doStuff<U>(input: U /* If T is an instance of number, then input type U should be an instance of custom type ABC, or If T is an instance of string, the
class Gen<T> {
public doStuff<U>(input: U
/* If T is an instance of number,
then input type U should be an instance of custom type ABC, or
If T is an instance of string,
then input type U should an instance of custom type XYZ, else
compile error */) {
// do stuff with input
}
}
class-Gen{
公共文件(输入:U)
/*如果T是number的一个实例,
那么输入类型U应该是自定义类型ABC的实例,或者
如果T是字符串的实例,
然后输入类型U应该是自定义类型XYZ的实例,否则
编译错误*/){
//用输入做事情
}
}
这可以用TypeScript来表示吗?绝对可以,通过推理,这是很容易实现的。TypeScript允许您根据通用输入类型检查“返回”不同的类型。您应该只使用如下类型的
inputType
类型:
type InferInputType<T> =
T extends number ? ABC :
T extends string ? XYZ :
never;
const genNumber = new Gen<number>();
genNumber.doStuff({ value: 10 });
genNumber.doStuff({ value: 'abc' }); // Error
输入类型=
T扩展数字?ABC:
T扩展字符串?XYZ:
从未;
然后,您可以将Gen改写为:
class Gen<T> {
public doStuff(input: InferInputType<T>) {}
}
class-Gen{
公共doStuff(输入:InferInputType){}
}
然后您可以像这样使用您的类:
type InferInputType<T> =
T extends number ? ABC :
T extends string ? XYZ :
never;
const genNumber = new Gen<number>();
genNumber.doStuff({ value: 10 });
genNumber.doStuff({ value: 'abc' }); // Error
const genNumber=new Gen();
genNumber.doStuff({value:10});
genNumber.doStuff({value:'abc'});//错误
你可以在操场上看到一个工作示例:我有一个类似的问题,但这次涉及泛型……也许你有一些见解?贴在这里: