为link2aws编写TS类型声明后调用consoleLink报TypeError问题
问题现象
为link2aws库编写TypeScript类型声明文件用于Angular项目时,运行抛出错误:TypeError: (new link2aws__WEBPACK_IMPORTED_MODULE_1__.ARN(...)).consoleLink is not a function
涉及的代码如下:
- 导入语句
import { ARN } from 'link2aws';
- 业务调用代码
arn = 'arn:aws:...' let link = new ARN(arn).consoleLink();
- 自定义的
link2aws.d.ts类型文件
// Type definitions for link2aws // Definitions by: me <url redacted> declare module 'link2aws' { class ARN { constructor(text: string); string(): string; console(): string; qualifiers(): string[]; pathLast(): string; consoleLink(): string; } }
报错原因
两个问题共同导致这个报错:
- 导入方式错误:link2aws采用CommonJS规范默认导出ARN类,不存在名为
ARN的命名导出。用命名导入的写法拿到的不是ARN类本身,实例化后的对象自然没有对应方法。 - 类型声明和实际API不匹配:声明的
consoleLink是方法,但实际link2aws的ARN实例上,consoleLink是字符串类型的getter属性,不需要加括号调用,强行当函数调用自然会抛出"不是函数"的错误。同时声明的string/console/qualifiers/pathLast也都是实例属性,不是方法。
修复方案
按以下步骤修改即可:
- 调整TS配置,打开
tsconfig.json将esModuleInterop字段设为true,修正导入语句为默认导入:
import ARN from 'link2aws';
- 修正
link2aws.d.ts类型声明,匹配库的实际导出结构和API:
declare module 'link2aws' { class ARN { constructor(text: string); string: string; console: string; qualifiers: string[]; pathLast: string; consoleLink: string; } export default ARN; }
- 修正业务调用代码,去掉
consoleLink后的调用括号,直接访问属性:
const arn = 'arn:aws:...'; const link = new ARN(arn).consoleLink;
内容的提问来源于stack exchange,提问作者Aurelia Peters
相关产品推荐
相关产品推荐

