能否从已导入模块二次导入?AWS SDK导入方案咨询
解决方案
关于「从已导入模块再次导入」的问题
ES模块的import语法要求模块路径必须是字符串字面量,不能用变量(比如你代码里的aws),所以import { MessageAttributeMap } from aws;这种写法从语法上就不支持。
针对你的公共项目场景,有两种可行的调整方式:
方式1:在公共项目中直接导出需要的类型
修改公共项目的index.ts,把常用的类型直接导出:
export * as AWS from "aws-sdk"; // 直接导出需要的类型 export { MessageAttributeMap } from "aws-sdk/clients/sns"; // 其他常用类型也可以按需添加 export { S3 } from "aws-sdk/clients/s3";
这样业务项目里就能直接从公共包导入:
import { AWS as aws, MessageAttributeMap } from "@test/common";
方式2:在公共项目中导出子模块的引用
如果不想逐个导出类型,可以在公共项目里导出子模块的入口:
export * as AWS from "aws-sdk"; // 导出sns子模块 export * as SNS from "aws-sdk/clients/sns";
业务项目里就可以这样用:
import { SNS } from "@test/common"; type MessageAttributeMap = SNS.MessageAttributeMap;
关于「例2的替代方案」
结合你的公共包场景,上面两种方式已经解决了这个问题——要么直接导入MessageAttributeMap类型,要么通过公共包导出的子模块来引用类型,不用再写AWS.SNS.MessageAttributeMap这种长路径。
如果暂时不想修改公共项目,也可以在业务项目里用类型别名简化写法(但不如修改公共包优雅):
import { AWS as aws } from "@test/common"; type MessageAttributeMap = aws.SNS.MessageAttributeMap; // 也可以给子模块加别名简化调用 const SNS = aws.SNS;
内容的提问来源于stack exchange,提问作者CKT
相关产品推荐
相关产品推荐

