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()

Relaterte artikler