2016-11-14 63 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

我不需要知道一個特定的屬性存在,而是會有一組屬性(誰的名字I _do not know_將用字符串值定義)。 – ken

+0

我的意思是你在這裏訪問屬性:'input.queryParameters.oauth_token'。編譯器如何知道'oauth_token'令牌存在?所以這就是爲什麼我認爲這是不可能的,除非你有任何類型的變量。 –

+0

給定一個選項散列非常普遍,它具有名稱 - 值對,其中名稱在編譯時不知道。這是用例的基礎,重要的是_not_不會預測'oauth_token'屬性將被使用,而是要註釋對象上的任何名稱/值對將被允許。 – ken