然后执行以下操作:
interface Datum {
[k: string]: any
}
type Data = Datum[]
const inner = (data: Data) => {
console.log(data)
};
const outer = (data: Data | Data[]) => {
inner(data) // expect type error?
};
我不明白如何无法在type error
上获得inner function call
。我想这与generic
有关。不能找出一种重写的方法。
答案 0 :(得分:2)
Datum
界面太宽泛了。它将基本上代表任何对象(即,可通过字符串索引并且索引操作的结果为any
)。
鉴于对象类型太宽,Datum
,Datum[]
和Datum[][]
都可以分配给数组类型,因此不会出现任何错误。使界面更具体一点,您会得到一个错误。例如:
interface Datum {
[k: string]: boolean | number | string;
}
type Data = Datum[]
const inner = (data: Data) => {
console.log(data)
};
const outer = (data: Data | Data[]) => {
inner(data) // error now
};
或者就像@PatrickRoberts在评论中提到的那样,您可以在接口中添加一个number
索引,以使其与数组明确不兼容:
interface Datum {
[i: number]: never
[k: string]: any;
}
type Data = Datum[]
const inner = (data: Data) => {
console.log(data)
};
const outer = (data: Data | Data[]) => {
inner(data) // error
};
答案 1 :(得分:0)
最好的选择可能是直接使用object
界面而不是Datum
:
interface Datum {
[k: string]: any
};
// This is an object interface.
type Data = object[]; // instead of Datum[]
const inner = (data: object[]) => {
console.log(data)
};
Pd:我一直在寻找解决同一问题的方法,使用了@ titian-cernicova-dragomir的解决方案,效果很好。我最终发现react-csv
库中正在使用的对象接口。