2017-06-27 6 views
-1

Ich habe ein Modul, das chalk Farben für meine spezifischen Bedürfnisse patcht. Hier ist der Code:Wie patch Objekte in 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), 
    }; 
}); 

Above ich gerade durch alle chalk Arten gehen und flicken sie mit meiner speziellen escape Funktion. Dies würde jedoch nicht kompilieren. Ich erhalte diesen Fehler:

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 
Auch

, soll ich sagen, ich habe "noImplicitAny" Optionen in meinem tsconfig.json aktiviert.

Wie kann ich Typen hier korrekt beschreiben, ohne implizit any zu bekommen?

Antwort

-1

können Sie erweitern die ChalkStyleMap Schnittstelle den Index Signatur hinzuzufügen:

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

Wenn Sie die ChalkStyleMap Schnittstelle ändern möchten nicht, können Sie ChalkStyleMap in Ihre benutzerdefinierte Schnittstelle erweitern, aber Sie müssen verwenden Typ Behauptung Sie überall styles verwenden Sie den Compiler, um sicherzustellen, keine Fehler werfen:

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

let PatchedChalkStyleMap: YourChalkStyleMap; 

Siehe official documentation on merging interfaces

+0

Warum? Ich verwende bereits die Typisierung von Chalk und 'ChalkStyleMap' ist bereits [hier] deklariert (https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/chalk/index.d.ts#L93-L124) – denysdovhan

+0

@ denysdovhan Sie deklarieren die 'ChalkStyleMap'-Schnittstelle nicht erneut. Sie erweitern es einfach, um den benötigten Indexer hinzuzufügen. – Saravana

Verwandte Themen