打字稿中对象的通用类型数组

时间:2019-03-14 21:57:14

标签: javascript typescript

然后执行以下操作:

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有关。不能找出一种重写的方法。

2 个答案:

答案 0 :(得分:2)

Datum界面太宽泛了。它将基本上代表任何对象(即,可通过字符串索引并且索引操作的结果为any)。

鉴于对象类型太宽,DatumDatum[]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库中正在使用的对象接口。