2016-11-14 2 views
0

У меня есть очень простое определение Машинопись для «словаря», который выглядит следующим образом:Машинопись словарь не в состоянии выполнить

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

я затем использовать этот интерфейс в другом определении интерфейса, как так:

interface IGatewayInput { 
    queryParameters: IDictionary<string>; 
    body?: string; 
} 

я тогда есть функция, которая принимает IGatewayInput:

doSomething(input: IGatewayInput) { 
    if(input.queryParameters.oauth_token) { 
    // .... 
    } 
} 

но WH Ile я бы ожидать, что словарь, чтобы позволить «queryParameters», чтобы иметь любое значение ключа вместо этого я получаю следующее сообщение об ошибке:

error TS2339: Property 'oauth_token' does not exist on type 'IDictionary'.'

Что я делаю неправильно? Я думал, что мое определение позволит использовать любое ключевое значение на основе строки?

ответ

1

Вы определили «индексируемый тип» (typescript reference), который может быть использован в качестве индексатора массива:

if (input.queryParameters['oauth_token']) { 
    //... 
} 
+0

Это приводит к той же ошибке – ken

+0

Я не знаю, как вы тестируете, но этот код определенно должен работать! какую версию компилятора на машинке вы используете? – devlux

+0

vs-code и TS 2.0.9 – ken

0

Так как вы можете изменить свой словарь выполнения, я не думаю, что есть какой-нибудь способ, вы можете получить он статически компилируется (т. е. компилятор никогда не узнает, что это свойство существует).

Я думаю, что для этого нужно использовать определенный интерфейс/класс или any.

+0

Мне не нужно знать, что существует конкретное свойство, а скорее, что будет набор свойств (кто не знает меня, который будет определен со строковыми значениями). – ken

+0

Я имею в виду, что вы обращаетесь к собственности здесь: 'input.queryParameters.oauth_token'. Как компилятор знает, что существует токен 'oauth_token'? Поэтому я думаю, что это невозможно сделать, если у вас нет типа 'any' для переменной. –

+0

Очень часто задается хэш параметров, который имеет пары имя-значение, где имена не известны во время компиляции. Это является основанием для использования, и важно, чтобы не было предсказано, что будет использоваться свойство 'oauth_token', но аннотировать, что должна быть разрешена любая пара имя/значение в объекте. – ken

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