1

Type-Script以外のモジュールをTypeScriptプロジェクトにインポートします。Typescript import @ google-cloud/pubsub

このプロジェクトには独自の宣言や@types宣言がありません。そのため、私は自分の宣言をモジュール用に作成しました。私は宣言ファイル内のモジュールを宣言するときしかし、私は次のエラーを取得する:

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 
} 

答えて

0

Invalid module name in augmentation. Module '@google-cloud/pubsub' resolves to an untyped module at './node_modules/@google-cloud/pubsub/src/index.js', which cannot be augmented.

私はここで活字体2.2.2

を使用しています完全な宣言ファイルです私は別のタイプのないモジュールの定義を書き込もうとしていたときに、同じ問題に遭遇しました。私が見つけたのは、型なしモジュールの定義を書く場合、declare moduleが定義ファイル全体を包含していることを確認する必要があるということです。

したがって、単純なテストプロジェクトを作成して@google-cloud/pubsubモジュールをインポートしたときに、次の定義ファイルが私のためにコンパイルされました。残念ながら、私はこれがなぜ機能するのか説明する文書は見つかりませんでした。

index.d.ts

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:

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 
    } 
} 

/パブで遊んビットをSubの後、私は、次の概念実証コードを思い付い

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); 
    }); 
    } 
}); 
+0

ありがとうございます!それは私が "@ google-cloud/pubsub"パッケージを別のインポート構造でインポートするのに必要な唯一の違いを記述したように機能しました。これは次のようになります: 'import PubSub = require( '@ google-cloud/pubsub')'。 – Siggy