打字稿:我可以参考类型变量的类型变量吗?

时间:2017-09-17 14:50:46

标签: typescript generics

我有两种通用类型 - Client<T>MockClient<T>。我想描述第三种通用类型 - Mocked<C extends Client> - 它应该是MockClient的特化,对应于Client的给定特化。例如:

type PersonClient = Client<Person>;

// the following two types should be equivalent
type MockPersonClient = Mocked<PersonClient>;
type MockPersonClient = MockClient<Person>;

换句话说,我想声明一个类似的类型:

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

是否可以在打字稿中执行此操作?如果没有,是否有提案(我不知道如何调用此功能),或者我所描述的是定义不明确或根本难以在类型系统中实现?

1 个答案:

答案 0 :(得分:1)

我认为你想要的是相当明确的,但目前在TypeScript中不可用(从v2.5开始)。可以帮助您实现type-level function application或更一般extended typeof operator的一项功能。我不确定这些功能何时会进入TypeScript。

有解决方法。我在评论中发现的一个问题是使用Client<T>类型的多余/幻像属性来扩充T类型。假设Client<T>是一个类,您可以执行以下操作:

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

   // rest of class definition
} 
type Mocked<C extends Client<{}>> = MockClient<C['_clientType']>

是的,它必须是公共属性,但您可以给它一个名称,表明它是供内部使用的(前导下划线)。在运行时,它将是未定义的,Client的用户不需要注意它。 (如果Client是要从对象文字创建实例的接口,那就更复杂了,因为TypeScript会抱怨没有_clientType属性。)

如果值得你这样做,这取决于你。其他人可能会提出不同的解决方法。祝你好运!