【问题标题】:Typescript: Can't instantiate object using object literals when a function exists in the class打字稿:当类中存在函数时,无法使用对象文字实例化对象
【发布时间】:2017-10-02 04:32:03
【问题描述】:

我刚开始使用 Angular 2 和 Typescript,最近遇到了一些我觉得很奇怪的行为。

我的班级是这样的:

export class Person{
  id: number;
  name: string;
  height: number;
  weight: number;

  calculateBmi() {
    return (weight/(height*height));
  }
}

当使用对象字面量实例化一个新人时,像这样:

person: Person = {
    id: 1,
    name: "Jack Johnson",
    height: 180,
    weight: 70
  };

我在 Visual Studio 2017 中收到(设计时)错误:

类型“{id: number, name: string, height: number, weight: number}”不可分配给“Person”类型 类型“{id: number, name: string, height: number, weight: number}”中缺少属性“calculateBmi”

它还声明它

无法将类型“{id: number, name: string, height: number, weight: number}”转换为“Person”类型:“Person”类型具有非可选属性“calculateBmi”,该属性在“类型”中不存在{id: number, name: string, height: number, weight: number}'.

因此,编译器似乎将“calculateBmi”视为属性,而不是函数。 解决方法当然是添加一个构造函数并使用它来实例化类,但我想了解是否有任何方法可以解决这个问题,以便我仍然可以使用对象文字?

谢谢, 乔恩

顺便说一句:我正在使用 Resharper 2017.x 但我不认为这是导致出现错误消息的原因。

【问题讨论】:

  • 你告诉 TS 那个人应该是 tye Person。 Person 类型声明了一个方法 calculateBmi。因此,每次您有一个 Person 实例时,您都应该能够在该实例上调用 calculateBmi() 。但是您的对象文字没有这样的方法。所以你试图在脚上开枪,而 TypeScript 会阻止你这样做。如您所说,只需调用构造函数即可。

标签: angular typescript2.0


【解决方案1】:

您的实例化是错误的。要么用 new 调用构造函数

person: Person = new Person()

或者创建一个完整的对象字面量

person: Person = {
    id: 1,
    name: "Jack Johnson",
    height: 180,
    weight: 70,
    calculateBmi: function() {...}
  };

【讨论】:

  • 感谢 getjackx,但这意味着我每次实例化类时都必须定义函数。这远非最佳,但可能是使用对象文字的权衡...?
  • 为什么还要使用对象字面量?如有必要,您可以编写一个接受文字的构造函数。或者你不想要类中的函数。如果需要,您可以编写控制器或服务。
  • 好吧,我只是想掌握这种语言。
  • 我来自 C# 背景,并将其与使用对象初始化器实例化类进行比较,但我想它们完全不同。感谢您输入 getjackx!
  • @getjackx 为什么还要使用对象字面量?可能存在这样一种情况,我们通过 http 调用从服务器获取 Person 对象,并且需要将该 json 映射到 Person 类型变量。在这种情况下,我们无法访问 calculateBmi
猜你喜欢
  • 2018-08-14
  • 1970-01-01
  • 2015-05-26
  • 2017-09-06
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多