首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Typescript import @google-cloud/pubsub

Typescript import @google-cloud/pubsub
EN

Stack Overflow用户
提问于 2017-04-27 12:52:34
回答 3查看 6.1K关注 0票数 2

我想将一个非类型记录模块导入到一个TypeScript项目中。

这个项目没有自己的声明或@types声明,所以我为模块创建了自己的声明。但是,当我在声明文件中声明模块时,我会得到以下错误:

增强中的模块名称无效。模块“@google-cloud/pubsub”解析为'./node_modules/@google-cloud/pubsub/src/index.js',中一个无法扩展的非类型化模块。

我使用的是TypeScript 2.2.2

以下是完整的声明文件:

代码语言:javascript
复制
import stream from 'stream'
import events from 'events'

interface ConfigurationObject extends Object {
    projectId?: string
    keyFilename?: string
    email?: string
    credentials?: CredentialsObject
    autoRetry?: boolean
    maxRetries?: number
    promise?: Function
}

interface CredentialsObject extends Object {
    client_email?: string
    private_key?: string
}

interface QueryOptions extends Object {
    autoPaginate?: boolean
    maxApiCalls?: number
    maxResults?: number
    pageSize?: number
    pageToken?: string
}

interface SnapshotQueryOptions extends QueryOptions { }

interface TopicsQueryOptions extends Object { }

interface SubscriptionQueryOptions extends Object {
    topic?: string
}

interface SubscribeOptions extends Object {
    ackDeadlineSeconds: number
    autoAck: boolean
    encoding: string
    interval: number
    maxInProgress: number
    pushEndpoint: string
    timeout: number
}

interface SubscriptionOptions extends Object {
    autoAck?: boolean
    encoding?: string
    interval?: number
    maxInProgress?: number
    timeout?: number
}

interface SubscriptionObject extends Object {
    name: string
    topic: string
    pushConfig: PushConfigObject
    ackDeadlineSeconds: number
}

interface PushConfigObject extends Object {
    pushEndpoint: string
    attributes: {
        [key: string]: string
    }
}

interface TopicObject extends Object {
    name: string
}

interface SnapshotObject extends Object {
    name: string
}

interface Message {
    id: string
    ackId: string
    data: any
    attributes: any
    timestamp: number

    ack(callback: Function): void
    skip(): void
}

declare type ApiCallbackFunction<T> = (err: Error | null, data: T, apiResponse: any) => void

declare type CallbackFunction<T> = (err: Error | null, data: T) => void

declare type ApiPromiseResult<T> = [T, any]

declare class Subscription extends events.EventEmitter {
    ack(
        ackIds: string | string[],
        options?: {
            timeout: number
        },
        callback?: () => void
    ): Promise<void> | void

    create(
        options?: SubscribeOptions,
        callback?: ApiCallbackFunction<SubscriptionObject>
    ): Promise<ApiPromiseResult<SubscriptionObject>> | void

    createSnapshot(
        name: string,
        callback?: ApiCallbackFunction<SnapshotObject>
    ): Promise<ApiPromiseResult<SnapshotObject>> | void
}

declare class PubSub {
    constructor(
        config: ConfigurationObject
    )

    createTopic(
        name: string,
        callback?: ApiCallbackFunction<TopicObject>
    ): Promise<ApiPromiseResult<TopicObject>> | void

    getSnapshots(
        options?: SnapshotQueryOptions,
        callback?: CallbackFunction<SnapshotObject[]>
    ): Promise<any[]> | void

    getSnapshotsStream(
        options?: SnapshotQueryOptions
    ): stream.Readable

    getSubscriptions(
        options?: SubscriptionQueryOptions,
        callback?: ApiCallbackFunction<SubscriptionObject[]>
    ): Promise<ApiPromiseResult<SubscriptionObject[]>> | void

    getSubscriptionsStream(
        options?: SubscriptionQueryOptions
    ): stream.Readable

    getTopics(
        options?: TopicsQueryOptions,
        callback?: ApiCallbackFunction<TopicObject[]>
    ): Promise<ApiPromiseResult<TopicObject[]>> | void

    getTopicsStream(
        options?: TopicsQueryOptions
    ): stream.Readable

    snapshot(
        name: string
    ): any

    subscribe(
        topic: TopicObject | string,
        subName?: stream,
        options?: SubscribeOptions,
        callback?: ApiCallbackFunction<SubscriptionObject>
    ): Promise<ApiPromiseResult<SubscriptionObject>> | void

    subscription(
        name?: string,
        options?: SubscriptionOptions
    ): void

    topic(
        name: string
    ): TopicObject
}

declare module '@google-cloud/pubsub' {
    export = PubSub
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-08 13:31:43

当我试图为另一个非类型化模块编写定义时,我遇到了同样的问题。我发现,如果要为非类型化模块编写定义,则需要确保declare module包含整个定义文件。

例如,当我编写一个简单的测试项目并导入@google-cloud/pubsub模块时,为我编译了以下定义文件。不幸的是,我还没有找到任何文档来解释这一工作的原因。

代码语言:javascript
复制
declare module '@google-cloud/pubsub' {
  import * as stream from 'stream';
  import * as events from 'events';

  interface ConfigurationObject extends Object {
      projectId?: string
      keyFilename?: string
      email?: string
      credentials?: CredentialsObject
      autoRetry?: boolean
      maxRetries?: number
      promise?: Function
  }

  interface CredentialsObject extends Object {
      client_email?: string
      private_key?: string
  }

  interface QueryOptions extends Object {
      autoPaginate?: boolean
      maxApiCalls?: number
      maxResults?: number
      pageSize?: number
      pageToken?: string
  }

  interface SnapshotQueryOptions extends QueryOptions { }

  interface TopicsQueryOptions extends Object { }

  interface SubscriptionQueryOptions extends Object {
      topic?: string
  }

  interface SubscribeOptions extends Object {
      ackDeadlineSeconds: number
      autoAck: boolean
      encoding: string
      interval: number
      maxInProgress: number
      pushEndpoint: string
      timeout: number
  }

  interface SubscriptionOptions extends Object {
      autoAck?: boolean
      encoding?: string
      interval?: number
      maxInProgress?: number
      timeout?: number
  }

  interface SubscriptionObject extends Object {
      name: string
      topic: string
      pushConfig: PushConfigObject
      ackDeadlineSeconds: number
  }

  interface PushConfigObject extends Object {
      pushEndpoint: string
      attributes: {
          [key: string]: string
      }
  }

  interface TopicObject extends Object {
      name: string
  }

  interface SnapshotObject extends Object {
      name: string
  }

  interface Message {
      id: string
      ackId: string
      data: any
      attributes: any
      timestamp: number

      ack(callback: Function): void
      skip(): void
  }

  export type ApiCallbackFunction<T> = (err: Error | null, data: T, apiResponse: any) => void

  export type CallbackFunction<T> = (err: Error | null, data: T) => void

  export type ApiPromiseResult<T> = [T, any]

  export class Subscription extends events.EventEmitter {
      ack(
          ackIds: string | string[],
          options?: {
              timeout: number
          },
          callback?: () => void
      ): Promise<void> | void

      create(
          options?: SubscribeOptions,
          callback?: ApiCallbackFunction<SubscriptionObject>
      ): Promise<ApiPromiseResult<SubscriptionObject>> | void

      createSnapshot(
          name: string,
          callback?: ApiCallbackFunction<SnapshotObject>
      ): Promise<ApiPromiseResult<SnapshotObject>> | void
  }

  export class PubSub {
      constructor(
          config: ConfigurationObject
      )

      createTopic(
          name: string,
          callback?: ApiCallbackFunction<TopicObject>
      ): Promise<ApiPromiseResult<TopicObject>> | void

      getSnapshots(
          options?: SnapshotQueryOptions,
          callback?: CallbackFunction<SnapshotObject[]>
      ): Promise<any[]> | void

      getSnapshotsStream(
          options?: SnapshotQueryOptions
      ): stream.Readable

      getSubscriptions(
          options?: SubscriptionQueryOptions,
          callback?: ApiCallbackFunction<SubscriptionObject[]>
      ): Promise<ApiPromiseResult<SubscriptionObject[]>> | void

      getSubscriptionsStream(
          options?: SubscriptionQueryOptions
      ): stream.Readable

      getTopics(
          options?: TopicsQueryOptions,
          callback?: ApiCallbackFunction<TopicObject[]>
      ): Promise<ApiPromiseResult<TopicObject[]>> | void

      getTopicsStream(
          options?: TopicsQueryOptions
      ): stream.Readable

      snapshot(
          name: string
      ): any

      subscribe(
          topic: TopicObject | string,
          subName?: stream,
          options?: SubscribeOptions,
          callback?: ApiCallbackFunction<SubscriptionObject>
      ): Promise<ApiPromiseResult<SubscriptionObject>> | void

      subscription(
          name?: string,
          options?: SubscriptionOptions
      ): void

      topic(
          name: string
      ): TopicObject
  }
}

在玩了Pub/Sub之后,我想出了以下概念代码的证明:

index.d.ts

代码语言:javascript
复制
declare module '@google-cloud/pubsub' {
  namespace pubsub {
    class PubSub {
      topic (name: string) : Topic;
    }
    class Topic {
      subscribe (subscriptionName: string, options: Object, callback: Function): void;
    }
  }
  function pubsub(options: any): pubsub.PubSub;
  export = pubsub;
}

subscribe.ts

代码语言:javascript
复制
import * as pubsub from '@google-cloud/pubsub';

let ps = pubsub({
  projectId: 'project-id',
  keyFilename: 'key.json'
});

console.log('Subscribed to pubsub...');

ps.topic('test').subscribe('test', {autoAck: true}, (err: any, subscription: any) => {
  if (err) {
    console.log(err);
  } else {
    subscription.on('error', (err: any) => {
      console.log(err);
    });
    subscription.on('message', (message: any) => {
      console.log(message);
    });
  }
});
票数 1
EN

Stack Overflow用户

发布于 2019-01-03 16:26:58

仅供参考,如果在节点中使用pubsub

代码语言:javascript
复制
// Does not work
import {PubSub} from '@google-cloud/pubsub';
import * as PubSub from '@google-cloud/pubsub';


// Works
const {PubSub} = require('@google-cloud/pubsub');
const pubsub = new PubSub();
票数 1
EN

Stack Overflow用户

发布于 2019-03-17 10:43:11

有很多(?)这方面的活动的。可能上面的答案不会像预期的那样起作用。现在您需要详细的:

代码语言:javascript
复制
import PubSub = require("@google-cloud/pubsub");
const pubSub: PubSub.PubSub = new (PubSub as any).PubSub()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43658409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档