我有以下界面:
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;
}
这样做,我失去了类型推断的完全能力。没有这种丑陋的方式,有没有办法做到这一点?
答案 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;
}