在TypeScript中,如何使用泛型提取类实例类型?



到处寻找答案,但在我的GraphQL服务器中,我试图在我的订阅中添加更好的类型,因为我从NPM中提取的类型使用any太多。我编写了一个概述订阅的映射,其中每个映射值包含通道名称、订阅名称和用于键入有效负载的对象类:

class ConversationCreatedEvent {
conversationID: string;
userID: string;
}
export const Subscriptions = {
conversationCreated: {
name: 'onConversationCreated',
event: ConversationCreatedEvent,
channelName: 'CONVERSATION_CREATED',
},
};

我想写一个方法,允许你发布订阅,它有两个参数:订阅ID(映射键),一个对象符合在event字段中指定的类类型的实例。

到目前为止,我有:

const publishSubscription = <T extends keyof typeof Subscriptions>(
name: T,
data: typeof Subscriptions[T]['event']
) => {
// TODO: implement
};

然而,这种方法使第二个参数为typeof ConversationCreatedEvent,并期望键如length,name,apply等(即,您在类对象中找到的键,而不是类的实例)。我需要它来接受实际的类成员,例如conversationID

希望这一切都有意义。我觉得这很简单,只是我遗漏了一些小东西。我还在学习映射类型。

任何帮助都是感激的!

const Subscriptions将类构造函数作为值。所以:

typeof Subscriptions['consoversationCreated']['event']

等于:

typeof ConversationCreatedEvent

这意味着你有一个类构造函数类型,你想从中获得实例类型。

Typescript有一个内置的实用程序类型来做这个,叫做InstanceType

class Foo {}
// The following type aliases are equivalent
type FooInstance = Foo
type InstanceTypeFoo = InstanceType<typeof Foo>

或者在你的情况下:

InstanceType<typeof Subscriptions[T]['event']>

看到操场

最新更新