【问题标题】:Shorthand for field initializer when class has computed property类具有计算属性时字段初始值设定项的简写
【发布时间】:2018-02-12 01:50:16
【问题描述】:

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

class Person {
  firstName: string;
  lastName: string;

  get fuillName(): string {
    return this.firstName + ' ' + this.lastName;
  }
}

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

let p: Person = {
  firstName: 'John',
  lastName: 'Smith'
};

这给了我一个错误:

键入'{名:字符串;姓氏:字符串; }' 不可分配给类型 'Person'。 '{ firstName: string; 类型中缺少属性 'fuillName'姓氏:字符串; }'。

嗯? fullName 是只读属性。于是我跟着this question 实现了一个部分初始化器:

constructor(init?: Partial<Person>) {
  Object.assign(this, init);
}

同样的错误。我知道我可以做到:

let p = new Person();
p.firstName = 'John';
p.lastName = 'Smith';
console.debug(p.fullName);

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

【问题讨论】:

  • “同样的错误。” -- 你是否真的更新了你的初始化程序来调用一个构造函数,就像你从节目中得到的答案一样?
  • 好的,您接受@Vega 的回答这一事实表明您确实没有按照您阅读的答案已经显示的那样去做。

标签: angular typescript


【解决方案1】:

如果你定义 Person 类如下:

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

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

    get fullName(): string {
       return this.firstName + ' ' + this.lastName;
    }
  }

你可以像下面这样初始化一个新用户:

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

更进一步:

  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";

Plunker Demo

【讨论】:

  • 这会将fullName 更改为一个函数,但我猜这是一个不错的折衷方案
  • 您将 OP 的 Partial&lt;Person&gt; 更改为 Object 的任何原因?这似乎只引入了做错事的可能性,这意味着当你例如你没有得到任何提示时。不小心输入了fristName 而不是firstName
  • @hvd,谢谢!我省略了,主要是因为我认为它与问题无关。我可能应该使用安全导航运算符或类属性(我想我在编辑之前就这样做了......)。我会根据您的建议更新我的答案。
猜你喜欢
  • 2012-02-07
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 2013-01-04
  • 2022-01-23
相关资源
最近更新 更多