Typescript 什么时候选择类型`{}`而不是`object`,这有关系吗?

Typescript 什么时候选择类型`{}`而不是`object`,这有关系吗?,typescript,Typescript,我想知道{}和对象之间的类型脚本(语义)差异 例如,如果您有一个接受对象的函数,但您不知道或不关心其形状,您会将其声明为{}或对象,还是不重要 下面是一个例子: export async function updateSomeUserData( userId: string, data: object ): Promise<void> { const ref = await getUserDataRef(userId); await ref.update({

我想知道
{}
对象
之间的类型脚本(语义)差异

例如,如果您有一个接受对象的函数,但您不知道或不关心其形状,您会将其声明为
{}
对象
,还是不重要

下面是一个例子:

export async function updateSomeUserData(
  userId: string,
  data: object
): Promise<void> {
  const ref = await getUserDataRef(userId);

  await ref.update({
    ...data
  });
}
导出异步函数updateSomeUserData(
userId:string,
数据:对象
):承诺{
const ref=await getUserDataRef(userId);
等待参考更新({
…数据
});
}

在现实生活中,您可能希望使用类型中的可选键严格定义所有可能的数据属性,但我认为这种情况可能发生在您不希望如此具体的情况下。

差别非常微妙:

  • 键入为
    {}
    对象的对象可以表示任何对象

  • 类型为
    对象的对象只能表示非基本类型-换句话说,它不能是
    数字
    字符串
    布尔
    符号
    未定义

在这两种情况下,使用
obj.member
语法将只允许您访问
对象
原型的成员

这就是
{}
对象
不同于
任何
类型的原因-后者不提供任何类型安全性,而前者只提供
对象
原型成员的类型安全性


要访问任意键,您必须使用
obj[“member”]
语法,这有效地告诉类型系统“在运行时之前我不知道此成员是否存在”。因此,您应该确保对其进行空检查

谢谢你的明确回答!我不希望{}代表任何对象。关于替代语法也有很好的观点。@ThijsKoerselman:是的,乍一看它不是非常直观的-
{}
对任何对象都有效的原因是因为TypeScript是-没有成员的类型实际上是所有其他类型的子集。