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

amw*_*l04 5 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?
};

Run Code Online (Sandbox Code Playgroud)

我不明白,我怎么不明白一个type errorinner function call。我想这与generic. 想不出重写的方法。

Tit*_*mir 4

接口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
};
Run Code Online (Sandbox Code Playgroud)

或者正如 @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
};
Run Code Online (Sandbox Code Playgroud)