2
votes

@ mailchimp / mailchimp_marketing / types.d.ts 'n'est pas un module dans nodeJs

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.


0 commentaires

3 Réponses :


1
votes

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"
    ]


6 commentaires

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



0
votes

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.


2 commentaires

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() .



1
votes

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> => {}
    }
  }
}


0 commentaires