Typescript索引签名返回缺少索引签名的数组结果
我有一个类似JSON的Typescript索引签名返回缺少索引签名的数组结果,typescript,Typescript,我有一个类似JSON的 "phone":{ "home":[{"label":"Phone1", "val":"123"},{"label":"Phone1", "val":"123"},{"label":"Phone1", "val":"123"}], "work":[{"label":"Phone1", "val":"123"}, {"label":"Phone1", "val":"123"}, {"label":"Phone1", "val":"123"}], "....":[{"labe
"phone":{
"home":[{"label":"Phone1", "val":"123"},{"label":"Phone1", "val":"123"},{"label":"Phone1", "val":"123"}],
"work":[{"label":"Phone1", "val":"123"}, {"label":"Phone1", "val":"123"}, {"label":"Phone1", "val":"123"}],
"....":[{"label":"Phone1", "val":"123"}]}
因此可能会有更多的电话对象,如紧急电话等,但我知道的是,该值将是一个label/val对象数组
所以我创建了一个接口
export interface Person {
phone:IHashOfPhones
}
export interface IHashOfPhones {
[index:string]: Phone[]
}
export interface Phone {
label: string;
val:string;
}
然而,在编译过程中,我遇到了如下错误
Index signature is missing in type { home : ...
如果我将IHashOfPhones
设置为返回any
一切正常,但我松开了类型安全
在代码中,我只循环它,没有赋值
有没有办法确保类型安全,或者我做了一些完全错误的事情?使用可转位类型
从JSON字符串:
let jsonString: string = `{
phone: {
home: [{ label: "Phone1", val: "123" }, { label: "Phone1", val: "123" }, { label: "Phone1", val: "123" }],
work: [{ label: "Phone1", val: "123" }, { label: "Phone1", val: "123" }, { label: "Phone1", val: "123" }],
other: [{ label: "Phone1", val: "123" }]
}
}`;
let data1: Person = JSON.parse(jsonString);
或者,从JS对象:
let data2: Person = <any>{
phone: {
home: [{ label: "Phone1", val: "123" }, { label: "Phone1", val: "123" }, { label: "Phone1", val: "123" }],
work: [{ label: "Phone1", val: "123" }, { label: "Phone1", val: "123" }, { label: "Phone1", val: "123" }],
other: [{ label: "Phone1", val: "123" }]
}
};
我想我和你做的一样,但在我的例子中,返回数组是因为某种原因不起作用的,该死……不,对象不是字符串。只需使用“来自JS对象”的示例,并将其转换为
。
export interface IHashOfPhones { // Replace the other implementation by this one
home?: Phone[]
work?: Phone[]
other?: Phone[]
}
let data3: Person = {
phone: {
home: [{ label: "Phone1", val: "123" }, { label: "Phone1", val: "123" }, { label: "Phone1", val: "123" }],
work: [{ label: "Phone1", val: "123" }, { label: "Phone1", val: "123" }, { label: "Phone1", val: "123" }],
other: [{ label: "Phone1", val: "123" }]
}
};