如何表达接口(IResponse),其中一个属性具有字符串键(静态情况下是未知的)。下面,键values
可以是books
,chairs
,所有其他键和类型都是静态已知的。下面的实现给出了错误。我猜错误是因为IResponse
上的索引签名使所有属性值都是IValue[]
。有办法做到这一点吗?
export interface IMeta{}
export interface IValue{}
export interface IResponse {
meta: IMeta;
[index: string]:IValue[];
}
export class Response implements IResponse {
meta:IMeta;
values:IValue[];
//books:IValue[];
//anything:IValue[];
}
4条答案
按热度按时间a1o7rhls1#
老问题,但这里是我如何解决自己的问题。
编辑:2023年1月14日:如果您知道可能的形状是什么,则有一种更好的方法来实现类型安全:
5uzkadbs2#
如果您为已知类型定义一个接口,为“未知”类型定义一个单独的接口,则可以使用类型Assert来告诉编译器您要使用的接口。
这并不理想,但您正在一个边缘情况下工作(即不完全动态,也不完全静态)。
您可以在
<IResponse> resp
和<IFunkyResponse> resp
之间使用type-assert来访问其中一个样式。zvokhttg3#
无接口:
0ejtzxu14#
不幸的是,似乎没有确切的答案,只有近似的解。
解决方案是在两个接口上使用交集类型,一个定义静态元数据,另一个定义动态键: