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是-没有成员的类型实际上是所有其他类型的子集。