Typescript 为什么我可以对类型化数组接口使用空值“[]”,而对类型化对象接口不能使用空值“{}”?

Typescript 为什么我可以对类型化数组接口使用空值“[]”,而对类型化对象接口不能使用空值“{}”?,typescript,Typescript,我注意到我可以将下面的friends初始化为空数组[],但对于具有空对象{}的会话,我不能这样做。为什么会这样?有没有办法使用空对象而不必在界面中选择所有键 const initialState: { friends: Array<{ name: string; age: number; }>; session: { login: string; avatar: string; } } = { friends: [], // all

我注意到我可以将下面的friends初始化为空数组[],但对于具有空对象{}的会话,我不能这样做。为什么会这样?有没有办法使用空对象而不必在界面中选择所有键

const initialState: {
  friends: Array<{
    name: string;
    age: number;
  }>;
  session: {
    login: string;
    avatar: string;
  }
} = {
  friends: [], // all good
  session: {}  // throws error!
};
因为[]仍然是数组长度为零的有效数组

但是{}不是形式为{login:string;avatar:string}

的有效对象,因为[]仍然是数组长度为零的有效数组

但是{}不是{login:string;avatar:string}形式的有效对象

如果您有一个对象,让x={}并设置x.login=name,那么您刚刚更改了对象的格式。现在,如果一个给定类型的数组是空的,那么它仍然可以被认为是空的

如果您想要一个同时接受对象{}和{login:string,avatar:string}的界面,您可以使用:

interface GenericObject {
  [property: string]: any;
}
但是要小心使用,如果你想要任何格式的对象,你可能不会首先键入你的代码。

如果你有一个对象,让x={},然后设置x.login=name,你就改变了对象的格式。现在,如果一个给定类型的数组是空的,那么它仍然可以被认为是空的

如果您想要一个同时接受对象{}和{login:string,avatar:string}的界面,您可以使用:

interface GenericObject {
  [property: string]: any;
}
但是要小心使用,如果您想要任何格式的对象,您可能不会首先键入代码