如何在TypeScript中修补对象?

时间:2017-06-27 08:50:59

标签: typescript typescript-typings typescript2.0 chalk

我有一个模块可以根据我的特定需求修补chalk颜色。这是代码:

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),
  };
});

上面我只是浏览了所有chalk个样式,并使用我的特殊escape函数修补它们。但是,这不会编译。我收到这些错误:

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

另外,我应该说我在"noImplicitAny"中启用了tsconfig.json个选项。

如何正确描述类型,而不是隐式any

1 个答案:

答案 0 :(得分:-1)

您可以扩充ChalkStyleMap接口以添加索引签名:

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

如果您不想修改ChalkStyleMap界面,可以将ChalkStyleMap扩展到自定义界面,但是在使用styles的任何地方都必须使用类型断言来确保编译器不会抛出错误:

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

let PatchedChalkStyleMap: YourChalkStyleMap;

请参阅official documentation on merging interfaces