2016-03-04 2 views
0

мне нужно иметь массив классов, а затем иметь возможность перебрать этот массив и получить доступ к этим классам stratic свойства:доступа статическое свойство из массива Params

class Blah{ 
    static type: string = "blah"; 
} 

class Foo{ 
    blahs: Array<{new(): Blah}> 
    go(){ 
     this.blahs.map(function(blah){ 
      console.log(blah.type); 
     }) 
    } 
} 

этот пример приведет к ошибке:

Property 'type' does not exist on type new()=>Blah

Мне нужно, чтобы он был массивом, поскольку все эти классы являются классами для компонентов для игрового объекта, и каждый объект может иметь различный набор компонентов, но только один компонент каждого типа. Поэтому я делаю тип статическим свойством, чтобы проверить, добавлен ли такой компонент в игровой объект, не создавая экземпляр этого класса компонента.

так как я могу переписать этот код?

ответ

0

Ну вы можете иметь это так:

class Blah 
{ 
    static type: string = "blah"; 
} 

class Foo 
{ 
    blahs: Array<Blah> 
    go() 
    { 
     this.blahs.map(function(blah) 
     { 
      console.log(Blah.type); 
     }) 
    } 
} 

Но это не имеет никакого смысла для меня, потому что стоимость имущества «типа» статический будет распределяться между всеми экземплярами класса. Таким образом, ваш console.log будет писать одно и то же значение для каждого объекта.

Так что либо подумайте о том, чтобы сделать «тип» не статическим, либо подумать о переработке структуры ваших классов.

[EDIT]

Если у вас есть необходимость перебора множества различных классов и распечатывать их «типа» статическое свойство (с учетом всех из них есть один), то это может быть сделано таким образом.

Объявить отдельный файл модуля со всеми такими классами:

Blahs.ts:

export class Blah0 
{ 
    static type: string = "blah"; 
} 

export class Blah1 
{ 
    static type: string = "blah"; 
} 

export class Blah2 
{ 
    static type: string = "blah"; 
} 

Затем в app.ts:

import * as Blahs from 'Blahs'; 

class Foo 
{ 
    go() 
    { 
     Object.keys(Blahs).forEach(className => 
     { 
      console.log(Blahs[className].type); 
     }); 
    } 
} 

let f = new Foo(); 
f.go(); 

Надеется, что это помогает.

+0

thanx для вас ответ. У меня будет куча классов, унаследованных от Blah с различным значением 'type', и в любой момент времени я не буду иметь никаких знаний о том, какие классы находятся в массиве' blahs', поэтому я не могу использовать ни один из ваших вариантов. – SET

+0

«Блахи» - это не массив. Мы можем сказать его модуль с определенными в нем классами. Если вы можете получить ссылку на нее - вам не нужно знать какие-либо сведения о ней и код будет работать. – Amid

+0

Мне нужно, чтобы он был массивом, поскольку все эти классы являются классами для компонентов для игрового объекта, и каждый объект может иметь различный набор компонентов, но только один компонент каждого типа. Поэтому я делаю тип статическим свойством, чтобы проверить, добавлен ли такой компонент в игровой объект, не создавая экземпляр этого класса компонента. – SET

Смежные вопросы