属性不能分配给接口中的字符串索引

时间:2017-07-22 19:08:59

标签: typescript interface typescript2.0

我有以下界面:

export interface Meta {
  counter: number;
  limit: number;
  offset: number;
  total: number;
}

export interface Api<T> {
  [key: string]: T[];
  meta: Meta; // error
}

目前,我收到以下错误:

  

Property&#39; meta&#39;类型&#39; Meta&#39;不能赋予字符串索引   输入&#39; T []&#39;。

经过搜索,我在TS docs中找到了这句话:

  

虽然字符串索引签名是一种强大的描述方式   “字典”模式,他们还强制所有属性匹配   他们的回报类型。这是因为字符串索引声明了这一点   obj.property也可以作为obj [&#34; property&#34;]。

这是否意味着当我有一个字符串索引签名时,我不能没有匹配此类型的任何其他变量?

实际上我可以摆脱这个错误声明这样的界面:

export interface Api<T> {
  [key: string]: any; // used any here
  meta: Meta;
}

这样做,我失去了类型推断的完全能力。没有这种丑陋的方式,有没有办法做到这一点?

2 个答案:

答案 0 :(得分:10)

您可以使用intersection两个界面:

interface Api<T> {
    [key: string]: T[];  
}

type ApiType<T> = Api<T> & {
    meta: Meta;
}

declare let x: ApiType<string>;

let a = x.meta // type of `a` is `Meta`
let b = x["meta"]; // type of `b` is `Meta`

let p = x["someotherindex"] // type of `p` is `string[]`
let q = x.someotherindex // type of `q` is `string[]`

答案 1 :(得分:5)

当我尝试实现此接口时,提出的最佳解决方案不起作用。我最终用动态键嵌套了一部分。也许有人会发现它有用:

interface MultichannelConfiguration {
  channels: {
    [key: string]: Configuration;
  }
  defaultChannel: string;
}