2013-07-15 3 views
0

, когда у меня есть этот кодСтенография для назначения переменных

interface Foo1 { 
    a: string; 
    b: boolean 
    c: Object; 
} 

interface Foo2 extends Foo1 { 
    d: number; 
} 

я могу использовать некоторые стенографии для назначения переменных из объекта, созданные как Foo1 для вновь созданного типа объекта Foo2?

Это немного раздражает, когда у меня есть объект с 10 атрибутов ...

var test1: Foo1 = { a: '...', b: true, c: {} }; 

var test2: Foo2 = { a: test1.a, b: test1.b, c: test1.c, d: 3 }; 

ответ

1

машинопись позволит вам бросить товар в этом случае ... хотя это означает, что test1 и test2 являются тот же объект.

interface Foo1 { 
    a: string; 
    b: boolean 
    c: Object; 
} 

interface Foo2 extends Foo1 { 
    d: number; 
} 

var test1: Foo1 = { a: '...', b: true, c: {} }; 

var test2: Foo2 = <Foo2> test1; 
test2.d = 1; 

Если вы хотите получить копию, а не тот же объект, вы можете создать метод для копирования свойств объекта. Вот пример копии:

var test1: Foo1 = { a: '...', b: true, c: {} }; 

var test2: Foo2 = <Foo2>{}; 
for (var variable in test1) { 
    if(test1.hasOwnProperty(variable)) { 
     test2[variable] = test1[variable]; 
    } 
} 

С небольшим намеком дженериков, вы можете инкапсулировать это статический вспомогательный метод, например:

class ObjectHelper { 
    static copy<TFrom, TTo>(from: TFrom) : TTo { 
     var to = <TTo> {}; 
     for (var variable in from) { 
      if(from.hasOwnProperty(variable)) { 
       to[variable] = from[variable]; 
      } 
     } 
     return to; 
    } 
} 

var test1: Foo1 = { a: '...', b: true, c: {} }; 
var test2: Foo2 = ObjectHelper.copy<Foo1, Foo2>(test1); 
+1

Спасибо за это решение! Я буду использовать ваш 'ObjectHelper' ;-). –