Typescript 类型脚本:我可以引用类型变量的类型变量吗?

Typescript 类型脚本:我可以引用类型变量的类型变量吗?,typescript,generics,Typescript,Generics,我有两种通用类型-Client和MockClient。我想描述第三种泛型类型-Mocked,它应该是MockClient的专门化,对应于Client的给定专门化。例如: type PersonClient = Client<Person>; // the following two types should be equivalent type MockPersonClient = Mocked<PersonClient>; type MockPersonClient

我有两种通用类型-
Client
MockClient
。我想描述第三种泛型类型-
Mocked
,它应该是
MockClient
的专门化,对应于
Client
的给定专门化。例如:

type PersonClient = Client<Person>;

// the following two types should be equivalent
type MockPersonClient = Mocked<PersonClient>;
type MockPersonClient = MockClient<Person>;
类型PersonClient=Client;
//以下两种类型应等效
类型MockPersonClient=Mocked;
输入MockPersonClient=MockClient;
换句话说,我想声明一个类型,如:

type Mocked<C extends Client<T>> = MockClient<T>;
type Mocked=MockClient;

是否可以在Typescript中执行此操作?如果没有,是否有相关建议(我不知道该功能将如何命名),或者我所描述的内容定义不清,或者很难在类型系统中实现?

我认为您想要的内容定义得相当好,但目前在TypeScript中还不可用(从v2.5开始)。一个能让你达到目的的功能是或更通用。我不确定这些功能什么时候(如果有的话)会进入TypeScript

有一些变通办法。我使用的一个方法,您从我的评论中了解到,是使用类型为
T
的多余/幻影属性来扩充您的
客户机
类型。假设
Client
是一个类,您可以执行以下操作:

class Client<T> {
   // phantom property
   _clientType: T = void 0 as any;

   // rest of class definition
} 
type Mocked<C extends Client<{}>> = MockClient<C['_clientType']>
类客户端{
//幻影属性
_clientType:T=void 0,如有;
//类的其余部分定义
} 
类型Mocked=MockClient
是的,它必须是公共属性,但您可以给它一个名称,表明它是供内部使用的(前导下划线)。在运行时,它只是未定义的,
Client
的用户不需要注意它。(如果
Client
是一个要从对象文本创建实例的接口,则会有点复杂,因为TypeScript会抱怨没有
\u clientType
属性。)


这取决于你是否值得对你的班级这么做。其他人可能会有不同的解决办法。祝你好运

您能为
客户机添加定义吗?如果您可以从某些(可能是嵌套的)属性中获得
T
值,那么您想要的是可能的。
Client
只是一个示例-我正在处理的实际类型相当复杂;但我想我知道你的意思。如果
typeclient={obj:T}
那么我可以使用
typemocked=MockClient
(我没有想到这个!)。然而,我的类型不是这样的-我只能通过方法调用来获取
T
。有没有一种方法可以表示索引类型的返回值?看来我也不能通过宣布一个多余的私有财产来“欺骗”,只有当它是公共财产时,它才对我有效。