可以传递给Object.keys(o)的所有JS对象的TypeScript类型

时间:2017-11-15 18:05:57

标签: javascript node.js

我正在尝试确定Object.keys()的参数类型,这是官方声明(lib.es6.d.ts):

interface ObjectConstructor {
    new(value?: any): Object;
    (): any;
    (value: any): any;

    ...

    /**
      * Returns the names of the enumerable properties and methods of an object.
      * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.
      */
    keys(o: any): string[];
}

所以我有这样的功能:

 v.registerMap = function (o: NotSureWhatTypeToUse): Promise<Array<any>> {

        let keys: Array<string>;

        try {
          keys = Object.keys(o);  // perhaps this will never throw
        }
        catch (err) {
          _suman.log.error('Could not call Object.keys(o), where o is:', util.inspect(o));
          throw err;
        }

        return Promise.all(keys.map(function (k) {

          try {
            return valuesMap[k] = o.get(k)
          }
          catch (err) {
            return valuesMap[k] = o[k];
          }

        }));
      };

如上所示,我试图处理原始参数是Map或普通对象的情况。

异步库使用Dictionary<{}>作为类型类型参数的TypeScript类型。那是我要找的那个吗?

在异步库中,此类型如下所示:

export interface Dictionary<T> { [key: string]: T; }

也许是我要找的那个。

1 个答案:

答案 0 :(得分:0)

我认为最好的办法就是将输入限制为普通对象,如下所示:

type PlainObj = {}

v.registerMap = function (o: PlainObj): Promise<Array<any>> {...};
然而,我感到困惑的一件事是泛型如何在异步库中工作。 async lib使用Dictionary,如下所示:

export interface Dictionary<T> { [key: string]: T; }

我不知道Dictionary<any>PlainObj的区别。