Hämta klassmetoder i TypeScript
Jag kör TypeScript-enhetstester med Mocha Chai (efter att ha ställt in kompilatoralternativen till ts-node).
I ett av mina enhetstester skulle jag vilja få alla metoder i en hjälparklass som jag har skapat och köra samma tester på dem. För att vara mer konkret skulle jag vilja uppnå något liknande detta:
UtilityClass.getMethods().forEach(method=>{method(sameInputData)})
Finns det ett sätt att implementera getMethods elegant? Eller kanske ett annat sätt att ta itu med detta behov?
Svar #1
Jag hade väldigt svårt att få andra svar att fungera. De täcker inte heller ett sätt att göra det utan en instans, om det är till hjälp för dig som det var för mig.
Detta är vad jag kom på:
SomeClass.ts
import { route } from "../../lib/route_decorator";
export class SomeClass {
index() {
console.log("here");
}
}
Och 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)));
Detta fungerar och ger utskriften:
[ 'constructor', 'index' ]
[ 'constructor', 'index' ]
Svar #2
Du glömmer att TypeScript är Javascript. Kom ihåg att TypeScript-kompilatorn kompilerar din kod till Javascript.
Så, som du normalt gör i Javascript, kan du lista medlemmar på ett objekt så här:
UtilityClass myclass = ...;
for (var member in myclass) { /* do something */ }
Mer avancerad
Om du vill vara säker på att du inte får ärvda medlemmar:
for (var member in myclass) {
if (myclass.hasOwnProperty(member)) {
/* do something */
}
}
Extrahera metoder
Om du vill vara säker på att du bara får metoder (funktioner):
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...
}
}
}
Reflektion i TypeScript
Som du kan se kräver metoderna en instans att arbeta på. Du arbetar inte på klassen. Reflektion är det du försöker uppnå i OOP:s sammanhang; dock hanterar Javascript (som inte är OOP) det på ett annat sätt.
