Nodejs应用集成TS
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nodejs应用集成TS相关的知识,希望对你有一定的参考价值。
参考技术A express myappnpm install typescript
npm install ts-node
main.js 是应用主函数入口
node start.js
@mailchimp/mailchimp_marketing/types.d.ts' 不是 nodeJs 中的模块
【中文标题】@mailchimp/mailchimp_marketing/types.d.ts\' 不是 nodeJs 中的模块【英文标题】:@mailchimp/mailchimp_marketing/types.d.ts' is not a module in nodeJs@mailchimp/mailchimp_marketing/types.d.ts' 不是 nodeJs 中的模块 【发布时间】:2021-02-17 11:53:19 【问题描述】:我在我的 NodeJS 应用程序中导入了 import @mailchimp/mailchim_marketing:
import mailchimp from "@mailchimp/mailchimp_marketing";
但是,它给出了以下错误:
type.d.ts 不是模块
我已经搜索过是否有 @types/@mailchimp/mailchimp_marketing 但我看不到它。
【问题讨论】:
【参考方案1】:@mailchimp/mailchimp_marketing 提供的type.d.ts
文件没有库的类型,包也没有@types 包。所以有必要创建自己的来覆盖他提供的。
为此,请创建文件夹@types/@mailchimp/mailchimp_marketing
(一个在另一个文件夹中)并在mailchimp_marketing
中创建文件index.d.ts
。
这个文件必须包含模块的声明,在里面,你要从库中使用的函数和类型。就我而言:
declare module '@mailchimp/mailchimp_marketing'
type Config =
apiKey?: string,
accessToken?: string,
server?: string
type SetListMemberOptions =
skipMergeValidation: boolean
export type SetListMemberBody =
email_address: string,
status_if_new: 'subscribed' | 'unsubscribed' | 'cleaned' | 'pending' | 'transactional'
merge_fields?: [key: string]: any
export default
setConfig: (config: Config) => ,
lists:
setListMember: (listId: string, subscriberHash: string, body: SetListMemberBody, opts?: SetListMemberOptions): Promise<void> =>
SetListMemberBody
有更多字段,setListMember
不是无效的,但我添加了我要使用的内容。为了发现这些字段和函数,我查看了源代码 (https://github.com/mailchimp/mailchimp-marketing-node) 和 api 文档 (https://mailchimp.com/developer/api/marketing/list-members/add-or-update-list-member/)。
在我的情况下(Typescript 3.7.3)没有必要更改 tsconfig.json
,但如果您使用旧版本,可能需要在 tsconfig.json 中为您的 compilerOptions 添加“typeRoots”:
"compilerOptions":
"typeRoots": ["@types", "node_modules/@types"]`
// other options
在这一切之后,我正常使用了该库:
import mailchimp, SetListMemberBody from '@mailchimp/mailchimp_marketing'
import crypto from 'crypto'
mailchimp.setConfig(
apiKey: process.env.MAILCHIMP_KEY,
server: 'serverHere',
);
const listId = 'listIdHere'
export const addSubscriber = async (member: SetListMemberBody): Promise<void> =>
const hash = crypto.createHash('md5').update(member.email_address).digest('hex')
await mailchimp.lists.setListMember(listId, hash, member)
【讨论】:
你为什么不把这个提交给@types? 如上添加 index.d.ts 时出现错误“导出分配的表达式必须是环境上下文中的标识符或限定名称”。对 TS 来说相当新,所以只是逐字记录,现在卡住了!如果有帮助,请使用 Typescript 3.8.0 @DavidRitchie - 我提交了一个编辑,但这是我发现的修复打字稿错误的内容。 ` declare module '@mailchimp/mailchimp_marketing' ...... type DefaultExport = setConfig: (config: Config) => void, lists: setListMember: (listId: string,subscriberHash: string, body: SetListMemberBody, opts ?: SetListMemberOptions) => Promise将您的代码替换为:
const mailchimp = require("@mailchimp/mailchimp_marketing");
好吧,你不会有类型安全,但至少你的代码可以工作。
【讨论】:
感谢我作为 TypeScript 的菜鸟所需要的东西!【参考方案3】:由于@mailchimp/mailchimp_transactional
存在类似问题,我必须使用declare module
创建自己的mailchimp__mailchimp_transactional.d.ts
(此包也只有types.d.ts
,与mailchimp_marketing
包中的types.d.ts
不同,它几乎是空的)。
因此,您可以使用他们的types.d.ts
键入创建自己的类型描述文件,将其放在项目的@types
文件夹中,然后将@types
添加到tsconfig.json
,如下所示:
"compilerOptions":
// other options here
"typeRoots": [
"@types",
"node_modules/@types"
]
mailchimp__mailchimp_transactional.d.ts
/* eslint-disable camelcase */
declare module '@mailchimp/mailchimp_transactional'
...
【讨论】:
我在应用程序的根目录中创建了一个 types 文件夹,并从 Mailchimp 复制了 types.d.ts 文件。然后我在 tsconfig 的 typeroot 选项中添加了@types,但错误仍然存在...... 这就是为什么types.d.ts
应该包裹在declare module
中
错误现在消失了,但是当我尝试设置 mailchimp.setConfig 时,它给出了一个错误“roperty 'setConfig' 在类型'typeof import("@mailchimp/mailchimp_marketing")'上不存在”"
在他们的types.d.ts
中根本没有setConfig
?
无异常【参考方案4】:
一个快速而肮脏的解决方案是删除 types.d.ts 文件,这可以防止错误,但您将不再获得 API 的任何类型信息。
【讨论】:
我想要更快更脏。如果您执行此导入路由,您如何设置 API 密钥? @AhrenFullStop 与其他方式相同:mailchimp.setConfig()
.【参考方案5】:
@mailchimp/mailchimp_marketing
的类型同时可用。
使用yarn add -D @types/mailchimp__mailchimp_marketing
或npm install --save-dev @types/mailchimp__mailchimp_marketing
安装类型包。
编辑:类型似乎不完整。
【讨论】:
以上是关于Nodejs应用集成TS的主要内容,如果未能解决你的问题,请参考以下文章
是否有任何第三方推送服务可以集成到 Nodejs Server 中?