2016-06-03 2 views
4

Я стараюсь есть словарь с использованием объектов в качестве ключей:Как я могу использовать словарь в качестве ключей?

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

Если я пытаюсь использовать его var urlpath = api.getItems; я получаю:

{[ключ объекта «GetItems» не существует на типе» : string]: string; ` }.

Если я изменить ее тип ключа к любому {[key: any]: string}, я получаю:

Индекс подписи параметр типа должен быть «строка» или «номер».

я могу использовать его, как это, но это не то, что я хочу:

var urlpath = api['getItems']; 

Как я могу иметь словарь с использованием объектов в качестве ключей?

+2

Вам необходимо создать интерфейс или класс со всеми параметрами, которые вы хотите, включая getItems. Затем вы объявляете api как объект этого типа.Если вы заявляете, как вы это делаете, теперь TypScript не поймет его, потому что у него нет интерфейса – iberbeu

+0

@iberbeu, ваше предложение работает, хотя было бы неплохо не использовать интерфейс. Теперь вы почему-то не понимаете это? – cfischer

+0

Потому что это типизированный язык. Это означает, что вам всегда нужно определить интерфейс для каждого объекта. На самом деле это то, что вы ищете, когда переходите к машинописному описанию, что при попытке кодировать способ, которым вы это сделали, появляется сообщение об ошибке. Если вы все еще хотите сделать это таким образом, тогда вы должны отдать машинописный текст и продолжать работать напрямую с JS – iberbeu

ответ

0

Смотрите, если это помогает ...

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, импортировать его интерфейс и класс, создать переменную типа IfcTypescriptDictionary.ts, инициализировать его с помощью класса и получить доступ к его различным типам, используя одну и ту же переменную.

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

С уважением

Аджай

1

Вы можете использовать прекрасную библиотеку, созданную @basarat и назвали "Машинопись-коллекций". Просьба найти по ссылке ниже: typescript collections

Что вам нужно просто установить его с помощью следующей команды:

npm install typescript-collections 

Он также содержит все необходимые определения только, чтобы сделать код опыт лучше.

0

Раствор:

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

Indexable types сделаны для того, чтобы использоваться с оператором []. Они обеспечивать проверку типа с этим оператором:

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

Они не обеспечивают способ доступа к любому произвольному имени элемента api.abc.

+0

спасибо, но меня интересует только доступ к произвольному члену, как указано в моем вопросе. – cfischer

+0

@lambdagreen Вы можете использовать 'const api: any', но вы потеряете проверку типа. – Paleo

Смежные вопросы