方法的泛型类型取决于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'});//错误

你可以在操场上看到一个工作示例:

我有一个类似的问题,但这次涉及泛型……也许你有一些见解?贴在这里: