我可以定义一个具有索引签名的Typescript类吗?

Chr*_*s T 23 typescript typescript1.5

我有一个接口类型IRawParams,只需指定一个string键和值any.

interface IRawParams {
    [key: string]: any
}
Run Code Online (Sandbox Code Playgroud)

我有一个类,ParamValues它包含键/值之上的一些行为.我想指定ParamValues该类实现IRawParams接口.

class ParamValues implements IRawParams {
    parseFromUrl(urlString: string) {
        Parser.parse(urlString).forEach(item => this[item.key] = item.val);
    }
}

// so I can do something like this
var params = new ParamValues();
params.parseFromUrl(url);
var userId = params.userId;
Run Code Online (Sandbox Code Playgroud)

当我尝试这个时,我得到一个编译器错误:

错误TS2420:类'ParamValues'错误地实现了接口'IRawParams'."ParamValues"类型中缺少索引签名.

我可以让我的类实现IRawParams接口,或者获取Typescript以允许我的类的实例与索引类型兼容{[key: string]: any}吗?

Rya*_*ugh 27

要定义具有索引签名的类,只需在类中编写索引签名:

interface IRawParams {
    [key: string]: any
}

class Foo implements IRawParams {
    [k: string]: any;
}
Run Code Online (Sandbox Code Playgroud)

  • 以及如何实施?即如何编写将索引传递给值的代码? (4认同)
  • @Jose在 `Foo` 类中,您可以访问如下值:`getme(key: string) { return this[key]}`。您可以使用 let foo = new Foo({ some: "raw", [0]: "params" })` 将值传递到 `Foo` 的构造函数中。`Foo` 的构造函数可以接收如下值: `constructor(values: IRawParams = { } as IRawParams) { Object.keys(values).map(key => { this[key] = value[key] }) }` 并且您可以使用 `foo.getme("some")` 或直接使用 `foo["some"]` 从 `Foo` 对象获取值。 (3认同)
  • 谢谢!现在我觉得自己像个白痴。我用花括号包裹了签名:`{[key: string]: any}` (2认同)
  • 另请注意,界面中的“[key: string]: any”也将包含数字作为索引。如果您只想允许字符串作为对象的键,只需在接口中添加“[index: number]: undefined”即可。 (2认同)
  • 因此,必须预先设置这些值。无论如何,有没有链接函数来确定键的值?即,如果有人从外面使用我的类,Foo ['tralara']我希望能够处理我类中函数的键值,并能够动态确定要返回的值。 (2认同)