从typescript中的函数返回请求类型的元素

时间:2016-05-22 16:00:25

标签: generics typescript

在我的代码示例中,我想搜索给定类型的所有组件,并希望它们以数组形式返回(例如,在components []中搜索A类型的所有组件)。但我收到代码示例下方标记行的错误。

class Component{/*...*/};

class A extends Component { /*...*/}

class B extends Component {/*...*/}

class Entity {
    public components: Component[];

    getComponentsByType<T>(): Array<T> {
        let returnValue: Array<T> = [];

        for (let component of this.components) {
            if (component instanceof T) {  // <-- 1. Error
                returnValue.push(<T>component); // <-- 2. Error
            }
        }

        return returnValue;
    }
}
  1. 错误:[ts] Cannot find name 'T'.
  2. 错误:[ts] Neither type 'Component' nor type 'T' is assingable to the other.
  3. 我在这里做错了什么? (这有可能吗?)

1 个答案:

答案 0 :(得分:1)

这完全可行。您需要将类名作为参数传递。看一下这个。 Using Class Types in GenericsgetComponentsByType<T>应替换为getComponentsByType<T extends Component>

class Component {/*...*/ };

class A extends Component { field = 'A'; }

class B extends Component { field = 'B'; }

class Entity {
    public components: Component[];

    getComponentsByType<T>(t: { new (): T }): Array<T> {
        let returnValue: Array<T> = [];

        for (let component of this.components) {
            if (component instanceof t) {  
                returnValue.push(<T>component); 
            }
        }

        return returnValue;
    }
}

let e = new Entity();
e.components = [new A(), new A(), new B()];
console.log(e.getComponentsByType(A));