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