在 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,并期望诸如 lengthnameapply 等键(即您会找到的键)在类对象中,而不是类的实例中)。我需要它来接受实际的班级成员,例如 conversationID

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

感谢任何帮助!

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

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

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

等同于:

typeof ConversationCreatedEvent

这意味着您有一个类构造函数类型,并且您想从中获取实例类型。

Typescript 有一个内置的实用程序类型来做到这一点called InstanceType.

class Foo {}

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

或者在您的情况下:

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

See playground

本文链接:https://www.f2er.com/1022.html

大家都在问