【问题标题】:What does this type annotation mean这个类型注解是什么意思
【发布时间】:2019-08-10 19:59:21
【问题描述】:

给定以下代码:

    private getJsonBody(body: {}|FormData) {
        return !(body instanceof FormData) ? JSON.stringify(body) : body;
    }

open+close 花括号作为一种类型是什么意思?在我使用的当前环境中,它无法编译,我必须将其更改为 any 才能使其工作。

【问题讨论】:

  • 它是一种没有已知属性的对象类型,也称为“空对象类型”。它几乎可以匹配任何东西。只有nullundefined 不能分配给它。
  • 那么为什么我会收到类似以下内容的编译器错误:“Object PersonViewModel cannot be assigned to type {}”(措辞可能不正确,我没有正确的代码现在)
  • 不知道,你可能需要发minimal reproducible example 让别人帮你。
  • 1) 您应该已经引用了您使用的 Typescript 版本。 2)This post 可以提供与Partial<FormData> 的替代解决方案

标签: typescript


【解决方案1】:

那是Empty Object Type

它描述了一个没有自己成员的对象。当您尝试访问此类对象的任意属性时,TypeScript 会发出编译时错误:

// Type {}
const obj = {};

// Error: Property 'prop' does not exist on type '{}'.
obj.prop = "value";

但是,您仍然可以使用在 Object 类型上定义的所有属性和方法,它们通过 JavaScript 的原型链隐式可用:

// Type {}
const obj = {};

// "[object Object]"
obj.toString();

相关信息是 Basarat's Lazy Object Initialization 条目,说明 Typescript 将如何拒绝此过程以及如何使用它。

使用该条目,您需要以这种方式更改代码:

interface Foo {
  bar: string;
  baz: number;
}

private getJsonBody(body: {} as Foo | FormData) {
  return !(body instanceof FormData)
    ? JSON.stringify(body)
    : body;
}

【讨论】:

  • 这对我来说很有意义 - 我正在调查为什么我的 openapi 生成的库没有编译,这与允许空请求的服务类有关,但 HttpClient 要求 {}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多