何时选择在`object`上键入`{}`还是重要?

时间:2017-12-09 11:08:17

标签: typescript

我想知道{}object之间的Typescript中的(语义)差异。

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

以下是一个例子:

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

  await ref.update({
    ...data
  });
}

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

1 个答案:

答案 0 :(得分:1)

差异非常微妙:

  • 输入@login_required @transaction.atomic def update_profile(request): if request.method == 'POST': user_form = UserForm(request.POST, instance=request.user) profile_form = ProfileForm(request.POST, request.FILES, instance=request.user.profile) if user_form.is_valid() and profile_form.is_valid(): user_form.save() profile_form.save() messages.success(request, ('Your profile was successfully updated!')) return redirect('myprofile') else: messages.error(request, ('Please correct the error below.')) else: user_form = UserForm(instance=request.user) profile_form = ProfileForm(instance=request.user.profile) return render(request, 'filter/updateprofile.html', { 'user_form': user_form, 'profile_form': profile_form }) {}的内容可代表任何对象。

  • 键入为Object的内容只能代表非原始类型 - 换句话说,它不能是objectnumberstring,{{ 1}},booleansymbol

在这两种情况下,使用null语法只允许您访问undefined原型的成员。

这是obj.memberObject{}类型不同的原因 - 后者不会为您提供任何类型安全,而前者只会为您提供类型安全{ {1}}原型成员。

要访问任意键,您必须使用Object语法,它有效地告诉类型系统'我不知道该成员是否存在直到运行时`。因此,你应该确保无效检查它!