2017-10-31 19 views
0

私はさまざまな属性を持つ適度に大きなクラスを持っています。クラスのコンストラクタを作成するのはかなり複雑です(コード内に新しいCLassObj(par1、par2、par3、par4、par5、par6、par7、... pars)があることを想像してみてください。順番を覚えておくことが不可能であるので、私は通常、このようにそれを初期化します。TypeScript:クラス内のオプションのパラメータ

{ 
    movie: this.movie, 
    row: 10, 
    seat: 12, 
    cashPrice: 170, 
    discount: 0, 
    bonusesPrice: 4200, 
    is3D: false, 
    isVR: false, 
    includesGlasses: false, 
    promocode: '' 
    } 

を、それは大丈夫です。しかし、私はクラス内のメソッドを持っている場合は、私もそれを再定義する必要があると思い

。!コンストラクタを作成せずにオプションのパラメータを作成する方法はありますか?あるいは、コンストラクタにオブジェクトを渡す方法がありますか?

答えて

1

でそれを呼び出すことができます。これにより、クラスの任意のメンバを任意に指定するオブジェクトリテラルが可能になります。

class BigClass { 
    movie: string; 
    row: number; 
    seat:number; 
    cashPrice: number; 
    discount: number; 
    bonusesPrice: number; 
    is3D: boolean; 
    isVR: boolean; 
    includesGlasses: boolean; 
    promocode: string; 
    public constructor (cfg: Partial<BigClass>){ 
     Object.assign(this, cfg); 
    } 
    method(){ 

    } 
} 

var d = new BigClass({ 
    is3D: true 
}); 
+1

このものは本当に私を助けました:)ありがとう! – Nausik

1

ここでは、オプションのパラメータ:

export class User { 
    constructor(
    public id?: string, 
    public fullName?: string, 
) {} 
} 

あなたは今、あなたは、コンストラクタのパラメータとしてPartial<T>を使用することができます

let user = new User(); 
let user = new User('ID1'); 
let user = {}; 
let user = { id: 'ID1' }; // Your IDE will give you completion in that case 
// And so on ... 
+0

を、これはところで完全なクラスである、あなたはあなたの特性を宣言する必要はありませんつまり、彼らは暗黙のうちですコンストラクタで宣言されている – trichetriche

+0

問題は、パラメータを順番に指定する必要があり、メソッドがある場合はオブジェクトリテラルで簡単に初期化できないことです(問題の一部である) –

+0

あなたはコンストラクタを使用しません、私の推測では、あなたが順序に気にしなかったということです。あなたはメソッドを宣言しなければなりません。しかし、あなたはクラスからメソッドを取得し、それらのためのクラスを作成することができますか? – trichetriche

0

この問題の解決策は非常にあります。 C:

をあなたは、ビルダーのようないくつかのデザインパターンを使用できます:あなたは解体使用することができ

C:

関連する問題