2017-11-15 1 views
0

Ich versuche, zu bestimmen, was der Parametertyp für Object.keys() ist, hier ist die offizielle Erklärung (lib.es6.d.ts):Typoskript Typ für alle JS-Objekte, die zu Object.keys weitergegeben werden können (o)

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[]; 
} 

so habe ich eine Funktion wie so:

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]; 
      } 

     })); 
     }; 

wie Sie oben sehen können, ich versuche, den Fall, in dem der ursprünglichen Parameter eine Karte oder ein einfaches Objekt zu behandeln.

Die Async-Bibliothek verwendet Dictionary<{}> für ihren TypeScript-Typ für einen ähnlichen Parametertyp. Ist das der, nach dem ich suche?

In der Asynchron-Bibliothek, sieht diese Art wie:

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

Vielleicht ist die eine die ich suche.

+0

Erhalten Sie einen Fehler vom obigen Code, oder funktioniert es nicht in irgendeiner Weise? Was ist 'valuesMap'? 'Object.keys' wird einen Fehler für' null' oder 'undefined' werfen, aber normalerweise erhalten Sie nur ein leeres Array für Nicht-Objekt-Werte –

+0

yeah Eines der kniffligsten Dinge in JS ist, zu wissen, wann der fremde Code geworfen wird ein Fehler oder nicht. Ich kann nicht sagen, ob Object.keys() jemals werfen wird. –

+0

Aber was die Frage stellt, ist, welchen Typ ich auf die Funktion beschränken sollte, und ich denke 'Typ t = {}' funktioniert. –

Antwort

0

Ich denke, das Beste, was zu tun ist nur die Eingabe in einfachen Objekte zu begrenzen, etwa wie folgt:

type PlainObj = {} 

v.registerMap = function (o: PlainObj): Promise<Array<any>> {...}; 

eine Sache, die ich bin verwirrt, aber, wie Generika in der Asynchron-Bibliothek arbeiten . Die Asynchron-lib Verwendung Wörterbuch, etwa so:

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

Ich weiß nicht, wie Dictionary<any> von PlainObj unterscheidet.

Verwandte Themen