2017-09-03 8 views
5

のは、私が計算プロパティを持つ非常に単純なクラスがあるとしましょうこれは私にエラーをもたらします:短縮形クラスが計算されたプロパティ

Type '{ firstName: string; lastName: string; }' is not assignable to type 'Person'. Property 'fuillName' is missing in type '{ firstName: string; lastName: string; }'.

Huh? 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の構文を使用してクラスを初期化するための速記はありますか?

+0

「同じエラーです。あなたが実際にコンストラクタを呼び出すようにイニシャライザを更新しましたか?あなたがショーから得た答えのようですか? – hvd

+1

さて、あなたが@ Vegaの答えを受け入れたという事実は、あなたがすでに示した答えを実際にはしなかったことを示しています。 – hvd

答えて

3

次のようにPersonクラスを定義する場合:さらに移動するには

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

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

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

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

次のような新しいユーザーを初期化することができます

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

+0

これは 'fullName'を関数に変更しますが、それはOKの妥協ですね –

+0

私の更新を見てください – Vega

+0

OPの' Partial 'を' Object'に変更した理由は何ですか?それは間違ったことをする可能性を導入するようなものだと思われます。つまり、あなたが何かヒントを得ることはできません。誤って 'firstName'ではなく' fristName'を入力してください。 – hvd

関連する問題