【问题标题】:Typescript module augmentation with a third party module and namespace带有第三方模块和命名空间的 Typescript 模块扩充
【发布时间】:2021-02-06 05:57:30
【问题描述】:

因此,我想扩展 AWS SDK DynamoDB 类以拥有一个新的 scan 实现,以克服 1 MB 的限制(请参阅 AWS documentationSO post)。找到关于 typescript 模块扩充的文档(查看 official docsrelevant SO questions 中的示例),即使 SO 示例实际上显示了如何扩展第三方类,我的解决方案(以类似方式设计)也不起作用.所以这是我的扩展:

import * as AWS  from "aws-sdk";

declare module "aws-sdk" {
    namespace AWS {
        interface DynamoDB {
            scanAll(params: any): any;
        }
    }
}

AWS.DynamoDB.prototype.scanAll = async function(params: AWS.DynamoDB.Types.ScanInput) {
    let items : any[]
    let db = <AWS.DynamoDB> this;
    var result = await db.scan(params).promise()
    if (result.Items)
        items.concat(result.Items);
    while (result.LastEvaluatedKey) {
        params.ExclusiveStartKey = result.LastEvaluatedKey;
        result = await db.scan(params).promise()
        if (result.Items) {
            items.concat(result.Items);
        }
    }
}

export {}

Typescript build 在AWS.DynamoDB.prototype.scanAll = 行出现错误

TS2339: Property 'scanAll' does not exist on type 'DynamoDB'.

我会假设命名空间在这里发挥作用?但是如何解决呢?

我尝试像这样省略命名空间:

import * as AWS  from "aws-sdk";

declare module "aws-sdk" {

        interface DynamoDB {
            scanAll(params: any): any;
        }

}

DynamoDB.prototype.scanAll = async function(params: AWS.DynamoDB.Types.ScanInput) {
    let items : any[]
    let db = <AWS.DynamoDB> this;
    var result = await db.scan(params).promise()
    if (result.Items)
        items.concat(result.Items);
    while (result.LastEvaluatedKey) {
        params.ExclusiveStartKey = result.LastEvaluatedKey;
        result = await db.scan(params).promise()
        if (result.Items) {
            items.concat(result.Items);
        }
    }
}

export {}

然后 Typescript 甚至找不到类型 DynamoDB 并给了我:

TS2304: Cannot find name 'DynamoDB'.

【问题讨论】:

    标签: typescript amazon-dynamodb module-augmentation


    【解决方案1】:

    this answer 中接受的解决方案帮助我解决了在尝试扩充某些 AWS CDK 类时遇到的类似问题。我的第一次尝试是做这样的事情:

     declare module "@aws-cdk/aws-kms" {
      interface Key {
        myStuff(): void;
      }
     }
    
    Key.prototype.myStuff = function (): void {...}
    

    但这不起作用,我遇到了和你一样的问题。我真正需要的是:

    import { Key } from "@aws-cdk/aws-kms/lib/key";
     
    declare module "@aws-cdk/aws-kms/lib/key" {
      interface Key {
        myStuff(): void;
      }
     }
    
    Key.prototype.myStuff = function (): void {...} 
    

    不同之处在于您需要使用模块类型的完整路径,而不仅仅是模块包名称。当第 3 方模块的作者将 Typings 拆分为多个文件时,事情会变得更加复杂。 This post 涵盖了其中的一些细微差别。

    最后,我能够在我的解决方案中找到一些生命迹象,并寻找下一个障碍。希望这能为模块增强提供一些见解。

    【讨论】:

    • 在看到你的帖子之前,我花了好几个小时来解决这个问题。完美运行!
    猜你喜欢
    • 2016-07-17
    • 2016-05-17
    • 2015-11-21
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 2015-09-09
    相关资源
    最近更新 更多