在接口中继承对象的方法,例如keys()

时间:2015-11-22 11:00:11

标签: typescript

我想将Javascript对象用作hashmap类型。记录的方法是使用以下语法:

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

但我喜欢能够访问诸如keys()之类的Object方法 做以下事情:

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实际上是一个Object,我希望它被这样对待。是 有办法表达这个吗?

此外,是否有一种直接的方式来使用泛型而不是Object,和 不只是阵列?

1 个答案:

答案 0 :(得分:1)

据我了解,您希望使用类对象静态方法作为类对象

首先,据我所知,您无法在接口中描述静态方法(因为接口用于实例,而不是用于类)。

但可能有一种解决方法:

  1. 您需要为对象实例声明一个接口。
  2. 您需要扩展常规对象类,并为实例添加方法。
  3. 其次,您希望使用方法作为接口 MyHashMap 。这意味着,您必须扩展界面 MyHashMap (顺便说一句,我建议将其称为 IMyHashMap 或类似于开头的大I的那个)界面对象。但它会导致许多编译器错误,因为我们使用 string 作为索引的基于索引的语法意味着每个属性/方法应该返回相同的类型(在您的情况下 string < /强>)。但也有一个warkaround:我建议使用联合类型作为变量 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());