2015-11-22 44 views
0

我想使用Javascript對象作爲散列表類型。該記錄的方式做與語法如下:繼承對象的方法,如接口中的keys()

interface MyHashMap { 
    [name:string]: string; 
} 

但我很想能夠訪問對象的方法,如鑰匙(),例如 做到以下幾點:

let m : MyHashMap = { foo: "why", bar: "not" } 
console.log(m.keys().sort()) 

但是,這並不工作:

$ tsc src/testsort.ts 
src/testsort.ts(6,15): error TS2339: Property 'keys' does not exist on type 'MyHashMap'. 

然而,這工作:

console.log(Object.keys(m).sort()) 

但是,這顯然是不必要的冗長,並不反映這樣的事實,即 MyHashMap是一個對象,並且我希望它被視爲這樣。有 有辦法表達這個嗎?

此外,有沒有一種簡單的方法來泛型對象,而不僅僅是數組?

回答

1

我的理解,你要使用的對象的靜態方法的類對象的所有實例的一個普通的方法。

首先,據我所知,你不能描述接口的靜態方法(因爲接口用於實例,而不是類)。

但也有可能是一個解決辦法:

  1. 你需要聲明一個接口對象實例。
  2. 您需要擴展常規的對象類,並在那裏添加方法的實例。

其次,你要使用的方法的接口MyHashMap。這意味着,你必須從界面對象擴展界面MyHashMap(順便說一下,我建議稱它爲IMyHashMap或類似的大I開始)。但它會導致很多編譯器錯誤,因爲基於索引的語法,在這裏我們使用爲指標意味着,每個屬性/方法應返還相同種類(在你的情況字符串)。但也有一個方法:我會建議使用聯合類型的變量m

請檢查下面的代碼,並注意評論:

// Declare an interface for the Object and declare a method for it 
interface Object 
{ 
    keys(): string[]; 
} 

// Implement the declared method keys (otherwise the method keys would "exist" only in typescript, 
// there wouldn't be any code for this method in JS) 
Object.prototype.keys = function(): string[] 
{ 
    return Object.keys(this); 
} 

// Declare an interface for the custom hash-map objects 
// (please, pay attention that this interface uses generic type) 
interface MyHashMap<ItemType> 
{ 
    [name: string]: ItemType; 
} 

// Create a variable of Union-Type (it's an instance of MyHashMap<string> and of Object at the same time) 
let m: MyHashMap<string> | Object = { foo: "why", bar: "not" }; 
console.log(m.keys().sort()); 
+1

啊好,我明白我很困惑,我以爲鍵()是Object.prototype中,但實際上它只是在對象本身。因此,無論如何Object.keys(m)是正確的方法。謝謝。 – niXar

+1

不客氣! –