当类具有计算属性时字段初始值设定项的简写

Mik*_*son 5 typescript angular

假设我有一个非常简单的类,带有计算属性:

class Person {
  firstName: string;
  lastName: string;

  get fuillName(): string {
    return this.firstName + ' ' + this.lastName;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我想创建一个类型的对象Person:

let p: Person = {
  firstName: 'John',
  lastName: 'Smith'
};
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误:

输入'{firstName:string; lastName:string; }'不能赋值为'Person'.类型'{firstName:string;中缺少属性'fuillName'; lastName:string; }".

咦?fullName是一个只读属性.所以我按照这个问题并实现了一个部分初始化器:

constructor(init?: Partial<Person>) {
  Object.assign(this, init);
}
Run Code Online (Sandbox Code Playgroud)

同样的错误.我知道我可以这样做:

let p = new Person();
p.firstName = 'John';
p.lastName = 'Smith';
console.debug(p.fullName);
Run Code Online (Sandbox Code Playgroud)

但是有没有使用JSON语法初始化类的简写?

Veg*_*ega 5

如果你定义 Person 类如下:

  class Person {
    firstName?: string;
    lastName?: string;

    constructor(values: Object = {}) {
      Object.assign(this, values);
    }

    get fullName(): string {
       return this.firstName + ' ' + this.lastName;
    }
  }
Run Code Online (Sandbox Code Playgroud)

您可以按如下方式初始化新用户:

  let p = new Person({firstName : 'John', lastName: 'Smith'}); //one line, two assignations
  console.log(p.fullName); 
Run Code Online (Sandbox Code Playgroud)

更进一步:

  class Person {
     ....// as above
     set fullName(fullName: string){
         let splitName = fullName.split(" ");
         this.firstName = splitName[0] || '';
         this.lastName = splitName[1] || '';
     }
   }

   let p = new Person()
   p.fullName = "Paul Doe";
Run Code Online (Sandbox Code Playgroud)

Plunker 演示