我有两种通用类型 - 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>;
是否可以在打字稿中执行此操作?如果没有,是否有提案(我不知道如何调用此功能),或者我所描述的是定义不明确或根本难以在类型系统中实现?
答案 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
属性。)
如果值得你这样做,这取决于你。其他人可能会提出不同的解决方法。祝你好运!