2016-08-07 18 views
0
  1. コンストラクタのアイテムがプロパティカウンタ(item.counter)を持っている場合、コンストラクタ要素(this.counter)でこのプロパティを作成する必要があります。このプロパティに項目がある場合のみ、このプロパティを作成する方法は?条件によって、コンストラクタで新しいプロパティを作成する方法
  2. そして次の質問、(例えばitem.is_owner = trueの場合、私はthis.owner = "所有者" を作成する必要があります)

TypeScript:コンストラクタのオブジェクトプロパティを設定する方法(オブジェクトのプロパティに応じて)

export class Item { 
 
    public counter: number; 
 
    public is_owner: boolean; 
 
    public owner: string; 
 
    
 
    
 
    constructor(item) { 
 
     this.counter = item.counter; // if item has counter, i need create this.counter 
 
     this.owner = "Owner"; // if item.is_owner == true ??? 
 
    } 
 
} 
 

 
var element = new Item (item);

+0

このプロパティに項目がある場合にのみこのプロパティを作成するのはどういう意味ですか、 'item'に' counter'がないとどうなりますか? 'Item'に' counter'メンバを持つことはできません。それはそこにあるかどうかです。しかし、値が 'null'または' undefined'になることがあります。それはあなたが探しているものですか? –

+0

ありがとう、ありがとう。はい、もちろん、私はthis.counter = item.counterを書くことができます|| nullですが、item.counterが存在する場合のみthis.counterを作成する方法はあります。 – marcos

+0

"アイテムにカウンタがない場合はどうなりますか?" element.counterにもこのプロパティはありません:) – marcos

答えて

1

あなたのコードから何をしようとしているのかを理解することは難しいです。例えば、itemはctorがパラメータとして取得するものですか? Itemまたは別のタイプの別のインスタンスですか?
また、所有者との全体が明確ではありません。

いずれの場合でも、クラスには定義済みのプロパティが含まれているか、または定義されていません。
あなたはもちろんのメンバーとして、それらを定義することなくCTORで複数のプロパティを追加することができますが、それはあなたがおそらくたとえば、避けることを好むtypescriptですが、コンパイル・エラーが発生します:

class Point { 
    public x: number; 

    constructor(x: number, y: number) { 
     this.x = x; 
     this.y = y; // error: Property `y` does not exists on type `Point` 
    } 
} 

あなたはanyにキャストしてそれを解決することができます。

class Point { 
    public x: number; 

    constructor(x: number, y: number) { 
     this.x = x; 
     (this as any).y = y; // no error 
    } 
} 

しかし、これは問題です:あなたにここに

let p = new Point(10, 5); 
console.log(p.x); 
console.log(p.y); // error: Property `y` does not exists on type `Point` 

はuができますse anyconsole.log((p as any).y);ですが、コンパイラのタイプチェックをバイパスしています。もしそれをしているのなら、なぜtypescriptを気にするのでしょうか?

nullまたはundefinedというメンバーを持つことを避けたいのであれば、同じインターフェイス/ベースクラスの異なる実装を使用し、受信したデータに基づいて適切な実装を作成するためにファクトリ関数を使用します。 :

interface ItemData { 
    counter?: number; 
} 

class BaseItem { 
    static create(data: ItemData): BaseItem { 
     if (data.counter) { 
      return new ItemWithCounter(data); 
     } 

     return new BaseItem(data); 
    } 

    constructor(data: ItemData) {} 
} 

class ItemWithCounter extends BaseItem { 
    private counter: number; 

    constructor(data: ItemData) { 
     super(data); 
     this.counter = data.counter; 
    } 
} 
+0

ありがとう、ありがとう。 "また、所有者とのすべてが明確ではありません。"他のタイプに基づいてもう1つの要素タイプを作成する必要があります。したがって、item.is_owner == trueの場合、element.ownerはelement.owner == "Owner"のようになります – marcos

+0

これは簡単です: 'this.owner = item.is_owner? "Owner": "NotOwner"; ' –

+0

item.is_ownerまたはitem.is_owner == falseがない場合、element.ownerプロパティは必要ありません。 element.owner == 'null'または 'undefined'または '' – marcos

関連する問題