我想将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,和 不只是阵列?
答案 0 :(得分:1)
据我了解,您希望使用类对象的键静态方法作为类对象
首先,据我所知,您无法在接口中描述静态方法(因为接口用于实例,而不是用于类)。
但可能有一种解决方法:
其次,您希望使用方法键作为接口 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());