Nodejs应用集成TS

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nodejs应用集成TS相关的知识,希望对你有一定的参考价值。

参考技术A express myapp

npm 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 _default : DefaultExport;导出默认_default; ` @Christian - 由于类型很大程度上依赖于 Mailchimp 自己的 API,我认为最好的方法是能够通过 Swagger 文档或类似的东西生成类型。在为 node 生成包的 Github 存储库中,有一些关于 TypeScript 支持的问题和 PR:github.com/mailchimp/mailchimp-client-lib-codegen/issues/134【参考方案2】:

将您的代码替换为:

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_marketingnpm install --save-dev @types/mailchimp__mailchimp_marketing 安装类型包。

编辑:类型似乎不完整。

【讨论】:

以上是关于Nodejs应用集成TS的主要内容,如果未能解决你的问题,请参考以下文章

功能/集成测试 NodeJS ReST API 实现

应用十:Vue之Vue与TypeScript集成开发

是否有任何第三方推送服务可以集成到 Nodejs Server 中?

ReactJS 与 azure SAML SSO 的集成

在nodejs中导入MySQL数据库进行集成测试的最简单方法

如何集成像谷歌日历这样的网络应用程序?