2016-06-03 14 views
4

Ich versuche, ein Wörterbuch mit Objekten als Schlüssel zu haben:Wie kann ich ein Wörterbuch mit Objekten als Schlüssel haben?

api: {[key: string]: string} = { 
    getItems: 'api/v1/items/all' 
}; 

Wenn ich versuche, es zu benutzen var urlpath = api.getItems; ich:

Property 'getItems' existiert nicht auf Typ ‚{[key : string]: string; ` }.

Wenn ich den Schlüssel des Typs jeder {[key: any]: string} zu ändern, die ich erhalten:

Ein Index Signaturparametertyp ‚string‘ sein muss, oder ‚Zahl‘.

ich es so verwenden können, aber das ist nicht das, was ich will:

var urlpath = api['getItems']; 

Wie kann ich ein Wörterbuch haben Objekte als Schlüssel verwenden?

+2

Sie müssen eine Schnittstelle oder Klasse mit allen Parametern erstellen, die sie haben soll, einschließlich getItems. Dann deklarieren Sie api als Objekt dieses Typs.Wenn Sie die Art deklarieren, wie Sie es jetzt tun, wird Typescript es nicht verstehen, weil es keine Schnittstelle hat – iberbeu

+0

@iberbeu Ihr Vorschlag funktioniert, obwohl es schön wäre, die Schnittstelle nicht zu benötigen. Wissen Sie jetzt, warum Typesrcpt das nicht versteht? – cfischer

+0

Weil es eine typisierte Sprache ist. Das bedeutet, dass Sie für jedes Objekt immer eine Schnittstelle definieren müssen. Das ist genau das, wonach Sie suchen, wenn Sie zu Typoskript wechseln. Wenn Sie versuchen, so zu schreiben, wie Sie es gemacht haben, erhalten Sie eine Fehlermeldung. Wenn Sie es immer noch so machen wollen, sollten Sie das Typoskript weggeben und direkt mit JS arbeiten. – iberbeu

Antwort

0

sehen, ob das hilft ...

TypescriptDictionary.ts

export interface typescriptDictionary { 
    getItems: string;  
    getItem2: string; 
} 

export class TypescriptDictionary implements typescriptDictionary { 

    private _getItems: string; 
    private _getItem2: string; 

    constructor (item: string, item2: string) { 
      this._getItems = item; 
      this._getItem2 = item2; 
    } 


    public get getItems(): string { 
      return this._getItems; 
    } 

    public get getItem2(): string { 
      return this._getItem2; 
    } 
} 

TypescriptDictionary.ts zu verwenden, seine Schnittstelle und Klasse zu importieren, eine Variable vom Typ IfcTypescriptDictionary.ts erstellen, initialisieren Sie es mit Klassenkonstruktor und greifen Sie auf seine verschiedenen Typen mit derselben Variablen zu.

DemoUsage.ts

import {IfcTypescriptDictionary} from 'filePath'; 
import {TypescriptDictionary} from 'filePath'; 

export class UseDemo { 

    var dictionary: IfcTypescriptDictionary; 

    // initialize it with its class constructor. 

    dictionary = new TypescriptDictionary('demo text', 'demo text1'); 

    // access it using 
    console.log(dictionary.getItems); 
    console.log(dictionary.getItems2); 
} 

Grüße

Ajay

1

Sie die wunderbare Bibliothek erstellt von @basarat und dem Namen "Typoskript-Sammlungen" verwenden können. finden freundlicherweise den unten stehenden Link: typescript collections

Was Sie brauchen, ist es nur mit dem folgenden Befehl zu installieren:

npm install typescript-collections 

Es enthält auch alle notwendigen Definitionen nur Code Erfahrung besser zu machen.

0

Eine Lösung:

const api: {[key: string]: string; getItems: string} = { 
    getItems: 'api/v1/items/all' 
}; 

Indexable types werden hergestellt, um mit dem [] Operator verwendet werden. Sie setzen Art mit diesem Operator Überprüfung:

api['abc'] = 123; // Type 'number' is not assignable to type 'string' 

Sie bieten keine Möglichkeit api.abc zu jedem beliebigen Mitgliedsnamen zuzugreifen.

+0

danke, aber ich bin nur interessiert an einem beliebigen Mitglied wie in meiner Frage angegeben. – cfischer

+0

@lambdagreen Sie können 'const api: any' verwenden, aber Sie verlieren die Typprüfung. – Paleo

Verwandte Themen