2017-06-27 8 views
-1

J'ai un module qui corrige chalk couleurs pour mes besoins spécifiques. Voici le code:Comment patcher des objets dans TypeScript?

import { ChalkStyleElement, ChalkStyleMap, styles } from 'chalk'; 
import escape from './escape'; 

/** 
* Decorate ASCII-colors with shell-specific escapes 
*/ 
let PatchedChalkStyleMap: ChalkStyleMap; 

Object.keys(styles).forEach((style: string) => { 
    PatchedChalkStyleMap[style] = { 
    close: escape(styles[style].close), 
    open: escape(styles[style].open), 
    reset: escape(styles[style].reset), 
    }; 
}); 

Au-dessus je marche seulement à travers tous les styles chalk et les patcher avec ma fonction spéciale escape. Cependant, cela ne compilerait pas. Je reçois ces erreurs:

src/colors.ts(10,3): error TS7017: Element implicitly has an 'any' type because type 'ChalkStyleMap' has no index signature. 
src/colors.ts(11,16): error TS7017: Element implicitly has an 'any' type because type 'ChalkStyleMap' has no index signature. 
src/colors.ts(12,15): error TS7017: Element implicitly has an 'any' type because type 'ChalkStyleMap' has no index signature. 
src/colors.ts(13,16): error TS7017: Element implicitly has an 'any' type because type 'ChalkStyleMap' has no index signature 

Aussi, je dois dire que j'ai "noImplicitAny" options activées dans mon tsconfig.json.

Comment est-ce que je peux décrire les types ici correctement, sans obtenir implicite any?

Répondre

-1

Vous pouvez augmenter l'interface ChalkStyleMap ajouter la signature d'index:

declare module "chalk" { 
    interface ChalkStyleMap { 
     [key: string]: ChalkStyleElement 
    } 
} 

Si vous ne souhaitez pas modifier l'interface ChalkStyleMap, vous pouvez étendre ChalkStyleMap dans votre interface personnalisée, mais vous devrez utiliser Type affirmation partout où vous utilisez styles pour assurer le compilateur ne jette pas des erreurs:

interface YourChalkStyleMap extends ChalkStyleMap { 
    [key: string]: ChalkStyleElement 
} 

let PatchedChalkStyleMap: YourChalkStyleMap; 

Voir official documentation on merging interfaces

+0

Pourquoi? J'utilise déjà les typages de craie et 'ChalkStyleMap' est déjà déclaré [ici] (https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/chalk/index.d.ts#L93-L124) – denysdovhan

+0

@ denysdovhan Vous ne déclarez pas l'interface 'ChalkStyleMap'. Vous l'augmentez simplement pour ajouter l'indexeur dont vous avez besoin. – Saravana