带有第三方模块和命名空间的Typescript模块扩充



因此,我想扩展AWS SDKDynamoDB类,以获得一个新的scan实现,该实现克服了1MB的限制(请参阅AWS文档和So文章(。找到了关于typescript模块扩充的文档(查看了官方文档中的示例和相关SO问题(,尽管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构建在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'.

这个答案中被接受的解决方案帮助我解决了在尝试增强一些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 {...} 

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

最后,我能够在我的解决方案中获得一些生命的迹象,并着眼于下一个障碍。希望这能为模块扩充提供一些见解。

最新更新