Typescript:当类中存在函数时,无法使用对象文字实例化对象

Yon*_*nZo 5 typescript2.0 angular

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

我的班级是这样的:

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

  calculateBmi() {
    return (weight/(height*height));
  }
}
Run Code Online (Sandbox Code Playgroud)

当使用对象文字实例化一个新人时,如下所示:

person: Person = {
    id: 1,
    name: "Jack Johnson",
    height: 180,
    weight: 70
  };
Run Code Online (Sandbox Code Playgroud)

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

类型“{id:number,name:string,height:number,weight:number}”不可分配给类型“Person”类型“{id:number,name:string,height:number,重量:数量}'

它还指出,它

无法将类型“{id:number,name:string,height:number,weight:number}”转换为类型“Person”:类型“Person”具有非可选属性“calculateBmi”,该属性在类型“{id:”中不存在数字,名称:字符串,高度:数字,重量:数字}'。

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

谢谢乔恩

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

get*_*ckx 5

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

person: Person = new Person()
Run Code Online (Sandbox Code Playgroud)

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

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

  • @getjackx 为什么你想使用对象文字?可能存在这样的情况:我们通过 http 调用从服务器获取 Person 对象,并且需要将该 json 映射到 Person 类型变量。在这种情况下我们无法访问calculateBmi (2认同)