获取typescript中的类方法

时间:2016-09-17 08:47:33

标签: typescript

我正在使用mocha chai运行typescript单元测试(在将编译器选项设置为ts-node之后)。

在我的一个单元测试中,我想获得我创建的实用程序类的所有方法,并对它们运行相同的测试。 更具体一点,我想实现这样的目标:

UtilityClass.getMethods().forEach(method=>{method(sameInputData)})

有没有办法优雅地实现getMethods?或许,另一种解决这种需求的方法是什么?

3 个答案:

答案 0 :(得分:5)

你忘了TypeScript是Javascript。请记住,TypeScript编译器会将您的代码编译为Javascript。

因此,正如您通常在Javascript中所做的那样,您可以枚举像这样的对象上的成员:

UtilityClass myclass = ...;

for (var member in myclass) { /* do something */ }

更高级

如果你想确保你没有得到继承成员:

for (var member in myclass) {
  if (myclass.hasOwnProperty(member)) {
    /* do something */
  }
}

提取方法

如果您想确保只获得方法(功能):

for (var member in myclass) { // For each member of the dictionary
  if (typeof myclass[member] == "function") { // Is it a function?
    if (myclass.hasOwnProperty(member)) { // Not inherited
      // do something...
    }
  }
}

TypeScript中的反射

正如您所看到的,这些方法需要一个实例来处理。你没有在课堂上工作。反思是你想要实现的,但在Javascript中并非如此。

答案 1 :(得分:2)

Andry的答案适用于ES3 / ES5,但如果你使用ES6和继承,事情会变得很奇怪......

这是一个更复杂的例子,以及如何在ES6的情况下检索每种类型的方法:

class ParentTest {
    parentFoo = function() {
        // do stuff
    }

    parentBar() {
        // do stuff
    }
}

class Test extends ParentTest {
    foo = function() {
        // do stuff
    }

    bar() {
        // do stuff
    }
}

let instance = new Test();

// These two works equally for every method declared as a property of type "function"
for(let method in instance) {
    console.log(method); // foo, foo2
}
console.log(Object.keys(instance)); // Array [ "parentFoo", "foo" ]

// This works for method of the class
let protoOfTest = Object.getPrototypeOf(instance);
console.log(Object.getOwnPropertyNames(protoOfTest)); // Array [ "constructor", "bar" ] 

// This works for methods of the extended class
let protoOfParentTest = Object.getPrototypeOf(protoOfTest);
console.log(Object.getOwnPropertyNames(protoOfParentTest)); // Array [ "constructor", "parentBar" ]

答案 2 :(得分:2)

我很难获得其他答案。他们也没有提供没有实例的方法,如果这样做对我有帮助的话。

这是我想出的:

SomeClass.ts

import { route } from "../../lib/route_decorator";

export class SomeClass {
    index() {
        console.log("here");
    }
}

还有somefile.ts

let ctrl = require("./filepath/filename");
// This is because angular exports as `exports.SomeClass = SomeClass;`
ctrl = ctrl[Object.keys(ctrl)[0]];
let ctrlObj = new ctrl();

// Access from Class w/o instance
console.log(Reflect.ownKeys(ctrl.prototype));
// Access from instance
console.log(Reflect.ownKeys(Object.getPrototypeOf(ctrlObj)));

这有效,输出:

[ 'constructor', 'index' ]
[ 'constructor', 'index' ]