J'ai importé import @ mailchimp / mailchim_marketing dans mon application NodeJS:
import mailchimp from "@mailchimp/mailchimp_marketing";
Cependant, cela donne l'erreur suivante:
type.d.ts n'est pas un module
J'ai cherché s'il y avait un @ types / @ mailchimp / mailchimp_marketing mais je ne pouvais pas le voir.
3 Réponses :
Avec un problème similaire avec @mailchimp/mailchimp_transactional
j'ai dû créer mon propre mailchimp__mailchimp_transactional.d.ts
avec le declare module
(ce package ne contient que types.d.ts
et il est presque vide contrairement aux types.d.ts
du package mailchimp_marketing
) .
Vous pouvez donc taper pour créer votre propre fichier de description de type en utilisant leur types.d.ts
, le placer dans le dossier @types
de votre projet et ajouter @types
à tsconfig.json
comme ceci:
/* eslint-disable camelcase */ declare module '@mailchimp/mailchimp_transactional' { ... }
mailchimp__mailchimp_transactional.d.ts
"compilerOptions": { // other options here "typeRoots": [ "@types", "node_modules/@types" ]
J'ai créé un dossier types à la racine de mon application et copié le fichier types.d.ts depuis Mailchimp. J'ai ensuite ajouté @types dans les options typeroot de tsconfig mais l'erreur persiste ...
C'est pourquoi types.d.ts
devrait être enveloppé dans le declare module
L'erreur a disparu maintenant mais quand j'essaye de définir mailchimp.setConfig, cela donne une erreur "roperty 'setConfig' n'existe pas sur le type 'typeof import (" @ mailchimp / mailchimp_marketing ")'"
Et aucun setConfig
dans leurs types.d.ts
du tout?
Aucun qui est désherbé
essayez de le déclarer vous-même en fonction de leurs documents et sources
Une solution rapide et sale consiste à supprimer le fichier types.d.ts, ce qui empêche l'erreur, bien que vous n'obtiendrez plus aucune information de type pour l'API.
Je veux plus rapide et sale. Comment définissez-vous votre clé API si vous effectuez cette route d'importation?
@AhrenFullStop comme vous le feriez autrement: mailchimp.setConfig()
.
Le fichier type.d.ts
fourni par @ mailchimp / mailchimp_marketing n'a pas les types de la bibliothèque et le package n'a pas non plus de package @types. Il est donc nécessaire de créer le vôtre pour remplacer le fourni par lui.
Pour ce faire, crée les dossiers @types/@mailchimp/mailchimp_marketing
(les uns dans les autres) et crée le fichier index.d.ts
dans mailchimp_marketing
.
Ce fichier doit contenir la déclaration du module, et à l'intérieur de là, les fonctions et les types que vous allez utiliser à partir de la bibliothèque. Dans mon cas:
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) }
SetListMemberBody
a beaucoup plus de champs et setListMember
n'est pas nul, mais j'ai ajouté exactement ce que je vais utiliser. Pour découvrir ces champs et fonctions, j'ai regardé dans le code source ( https://github.com/mailchimp/mailchimp-marketing-node ) et dans la documentation de l'API ( https://mailchimp.com/developer/api/marketing/list-members / add-or-update-list-member / ).
Dans mon cas (Typescript 3.7.3) n'était pas nécessaire de changer tsconfig.json
, mais si vous utilisez une version plus ancienne, il est peut-être nécessaire d'ajouter "typeRoots" pour votre compilerOptions dans tsconfig.json:
"compilerOptions": { "typeRoots": ["@types", "node_modules/@types"]` // other options }
Après tout cela, j'ai utilisé la bibliothèque normalement:
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> => {} } } }