actionscript 3 - Typescript-ekvivalent til actionscript3s describeType
Jeg vil gjerne gå gjennom mine .ts-filer ved kjøring og få ut litt informasjon om hvilke klasser som er i filen, hvilke funksjoner den har, hvilke egenskaper og om de er offentlige eller private.
I ActionScript 3 pleide jeg å bruke "describeType" for dette, som returnerte denne informasjonen i XML. Vet noen om en måte å få denne informasjonen i TypeScript?
Finnes det kanskje verktøy som kan analysere jsdoc for hvilken som helst filtype og returnere informasjon om det?
Svar #1
Siden du vil behandle filer, forstår jeg ikke kravet "ved kjøring".
Bortsett fra det, hvis du bare vil analysere TS-kode ved hjelp av TS, kan du bruke TypeScript-språkets tjenester, som har alle API-ene som trengs for å støtte en TypeScript-IDE, alt skrevet i TypeScript. I dette spesifikke eksempelet bør languageService.getScriptLexicalStructure(file) gjøre susen.
Hvis du vil gjøre dette fra kommandolinjen, eller ønsker å se et eksempel på bruk av språktjenestene, kan du prøve https://github.com/clausreinke/typescript-tools
cat reflection.ts
module foo{
export class A{
public x1:number = 10;
public x2 = 20;
public s1: string = "";
constructor(public x = true) {}
}
}
function listProperties(o, isClass?) {
var props = [];
console.log("name:",o["name"]);
var tmp = isClass ? new o : o;
for (var p in tmp)
console.log(p,typeof tmp[p]);
}
listProperties(foo.A,true);
node typescript-tools/bin/tss.js reflection.ts
"loaded c:/javascript/typescript/reflection.ts, TSS listening.."
prettyJSON true
"pretty JSON: true"
> structure reflection.ts
[
{
"loc": {
"name": "foo",
"kind": "module",
"kindModifiers": "",
"matchKind": "exact",
"fileName": "c:/javascript/typescript/reflection.ts",
"minChar": 0,
"limChar": 183,
"containerName": "",
"containerKind": ""
},
"file": "c:/javascript/typescript/reflection.ts",
"min": {
"line": 1,
"character": 1
},
"lim": {
"line": 9,
"character": 2
}
},
{
"loc": {
"name": "A",
"kind": "class",
"kindModifiers": "export",
"matchKind": "exact",
"fileName": "c:/javascript/typescript/reflection.ts",
"minChar": 17,
"limChar": 180,
"containerName": "foo",
"containerKind": "module"
},
"file": "c:/javascript/typescript/reflection.ts",
"min": {
"line": 2,
"character": 5
},
"lim": {
"line": 8,
"character": 6
}
},
{
"loc": {
"name": "x1",
"kind": "property",
"kindModifiers": "public",
"matchKind": "exact",
"fileName": "c:/javascript/typescript/reflection.ts",
"minChar": 49,
"limChar": 63,
"containerName": "foo.A",
"containerKind": "class"
},
"file": "c:/javascript/typescript/reflection.ts",
"min": {
"line": 3,
"character": 16
},
"lim": {
"line": 3,
"character": 30
}
},
{
"loc": {
"name": "x2",
"kind": "property",
"kindModifiers": "public",
"matchKind": "exact",
"fileName": "c:/javascript/typescript/reflection.ts",
"minChar": 81,
"limChar": 88,
"containerName": "foo.A",
"containerKind": "class"
},
"file": "c:/javascript/typescript/reflection.ts",
"min": {
"line": 4,
"character": 16
},
"lim": {
"line": 4,
"character": 23
}
},
{
"loc": {
"name": "s1",
"kind": "property",
"kindModifiers": "public",
"matchKind": "exact",
"fileName": "c:/javascript/typescript/reflection.ts",
"minChar": 116,
"limChar": 131,
"containerName": "foo.A",
"containerKind": "class"
},
"file": "c:/javascript/typescript/reflection.ts",
"min": {
"line": 6,
"character": 16
},
"lim": {
"line": 6,
"character": 31
}
},
{
"loc": {
"name": "constructor",
"kind": "constructor",
"kindModifiers": "",
"matchKind": "exact",
"fileName": "c:/javascript/typescript/reflection.ts",
"minChar": 142,
"limChar": 173,
"containerName": "foo.A",
"containerKind": "class"
},
"file": "c:/javascript/typescript/reflection.ts",
"min": {
"line": 7,
"character": 9
},
"lim": {
"line": 7,
"character": 40
}
},
{
"loc": {
"name": "listProperties",
"kind": "function",
"kindModifiers": "",
"matchKind": "exact",
"fileName": "c:/javascript/typescript/reflection.ts",
"minChar": 187,
"limChar": 368,
"containerName": "",
"containerKind": ""
},
"file": "c:/javascript/typescript/reflection.ts",
"min": {
"line": 11,
"character": 1
},
"lim": {
"line": 17,
"character": 2
}
}
]
Svar #2
Det finnes ingen TypeScript-refleksjons-API, men du kan bruke ES3 JavaScript-APIer!
Du bør ta en titt på disse funksjonene:
Object.getOwnPropertyNames()Object.getOwnPropertyDescriptor()Object.getPrototypeOf()Object.keys()
