рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдХрд╕реНрдЯрдо рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдПрдПрд╕рдЯреА рд▓рд┐рдЦрддреЗ рд╣реИрдВ

рдЯреЗрд╕реНрдЯрдореЗрд╕ рдЯреАрдо рдЖрдкрдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдЖ рдЧрдИ рд╣реИред рдЗрд╕ рдмрд╛рд░ рд╣рдо рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рд░реВрдкрд╛рдВрддрд░рдг рдкрд░ рдПрдХ рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЕрдЪреНрдЫрд╛ рдкрдврд╝ рд▓реЛ!


рдкрд░рд┐рдЪрдп


рдпрд╣ рдореЗрд░реА рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЗрд╕ рдмрд╣реБрдд рд╣реА рд╕рдорд╛рдзрд╛рди рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрдИ рдмреНрд▓реЙрдЧреЛрдВ рдореЗрдВ рджреЗрд░реА рдХреА рдФрд░ рд╕реНрдЯреИрдХрдСрд╡рд░рдлреНрд▓реЛ рдкрд░ рдЬрд╡рд╛рдм рдкрдЪрд╛рдпрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЙрд╕реА рднрд╛рдЧреНрдп рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕рдм рдХреБрдЫ рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА, рд▓реЗрдХрд┐рди рдЦрд░рд╛рдм рджрд╕реНрддрд╛рд╡реЗрдЬ рд╡рд╛рд▓реЗ рдЯреВрд▓рдмреЙрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрд╛ред


рдореБрдЦреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдБ


рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдкреАрдЖрдИ (рдкрд╛рд░реНрд╕рд░ рд╢рдмреНрджрд╛рд╡рд▓реА, рдкрд░рд┐рд╡рд░реНрддрди рдПрдкреАрдЖрдИ, рд╕реНрддрд░рд┐рдд рд╡рд╛рд╕реНрддреБрдХрд▓рд╛), рд╕рд╛рд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреЗрдбрд╝ (рдПрдПрд╕рдЯреА), рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди, рдХреЛрдб рдкреАрдврд╝реА рдХреА рдореВрд▓ рдмрд╛рддреЗрдВред


рдЫреЛрдЯреА рд╕рд┐рдлрд╛рд░рд┐рд╢


рдпрджрд┐ рдпрд╣ рдПрдПрд╕рдЯреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреА рдкрд╣рд▓реА рдмрд╛рд░ рд╕реБрдирд╡рд╛рдИ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдХреЛ @Vahihi рдЬреЛрд╢реА рджреНрд╡рд╛рд░рд╛ рдкрдврд╝рдиреЗ рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛ ред рдмреЗрд╕рдХ рдХреЗ рд▓реЗрдЦреЛрдВ рдХреА рдЙрд╕рдХреА рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдирд┐рдХрд▓реА, рдЖрдкрдХреЛ рдмрд╣реБрдд рдкрд╕рдВрдж рдЖрдПрдЧреА ред


рдХрд╛рд░реНрдп рд╡рд┐рд╡рд░рдг


рдПрд╡реЗрд░реЛ рдореЗрдВ, рд╣рдо рдЧреНрд░рд╛рдлрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдПрдХ рдмрд╛рд░ рдЬрдм рдореИрдВ рдЧреНрд░реЗрдлреНрд▓рдЬреЗрди рдХреЗ рдкрд╛рд░ рдЖрдпрд╛, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдореЗрдВ рдореЙрдбрд▓ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдпрд╣рд╛рдБ рдирд╣реАрдВ рджреВрдВрдЧрд╛ - рдЗрд╕рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореЙрдбрд▓ рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЧреНрд░рд╛рдлрдХрд▓реНрдЬреЗрди рдореЗрдВ рдпреЗ рдореЙрдбрд▓ рдПрдХ рддрд░рд╣ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди (YAML рдпрд╛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВред


рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди, рд╣рдо gRPC рдорд╛рдЗрдХреНрд░реЛрд╕реЙрд░реНрдХреНрд╕ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП GQL рдПрдХ рдореБрдЦреМрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдкреНрд░реЛрдЯреЛ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯреНрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣реИрдВ, рдФрд░ рдореИрдВ рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдирд┐рд░реНрдпрд╛рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рдХрд╛рд░рдг рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ рдФрд░ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рд╡рд┐рд╡рд░рдг рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЬрдорд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ) рд╕рдВрджрд░реНрдн)ред


рдУрдкрди рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рд╕реНрд╡рд░ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рдХрджрдо рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдерд╛ рдХрд┐ рдЧреНрд░реЗрдлреНрд▓рдЧреЗрди рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдореЗрд░рд╛ рд╕рд╛рд░реНрдердХ рдпреЛрдЧрджрд╛рди рд╣реИред рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЧреНрд░рд╛рдлрдХреНрд▓реЗрди рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╛рдореЛрдВ рдФрд░ рдШреЛрд╖рдгрд╛рдУрдВ (рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдлрд╝реАрд▓реНрдб) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @ рдмреИрдмреЗрд▓ / рдкрд╛рд░реНрд╕рд░ рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред


рд╣рд░ рдмрд╛рд░ рдЬрдм рдореБрдЭреЗ рдПрдПрд╕рдЯреА рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдореИрдВ рдкрд╣рд▓реЗ astexplorer.net рдЦреЛрд▓рддрд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ рдЕрднрд┐рдирдп рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВ ред рдпрд╣ рдЙрдкрдХрд░рдг рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдкрд╛рд░реНрд╕рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдПрдПрд╕рдЯреА рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдмреЗрдмрд▓ / рдкрд╛рд░реНрд╕рд░ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд╛рд░реНрд╕рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред Astexplorer.net рдХреЗ рд╕рд╛рде, рдЖрдк рдЙрди рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдирдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рд░реНрд╕рд░ рдХреЗ рдПрдПрд╕рдЯреА рдиреЛрдбреНрд╕ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рд╣реИред


рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдлрд╝рд╛рдЗрд▓ рдФрд░ рдПрдПрд╕рдЯреА рдХреЛ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрд╛рдмреЗрд▓-рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЗрдЦреЗрдВред


example.ts
import { protos } from 'my_company_protos' export type User = protos.user.User; 

ast.json
 { "type": "Program", "start": 0, "end": 80, "loc": { "start": { "line": 1, "column": 0 }, "end": { "line": 3, "column": 36 } }, "comments": [], "range": [ 0, 80 ], "sourceType": "module", "body": [ { "type": "ImportDeclaration", "start": 0, "end": 42, "loc": { "start": { "line": 1, "column": 0 }, "end": { "line": 1, "column": 42 } }, "specifiers": [ { "type": "ImportSpecifier", "start": 9, "end": 15, "loc": { "start": { "line": 1, "column": 9 }, "end": { "line": 1, "column": 15 } }, "imported": { "type": "Identifier", "start": 9, "end": 15, "loc": { "start": { "line": 1, "column": 9 }, "end": { "line": 1, "column": 15 }, "identifierName": "protos" }, "name": "protos", "range": [ 9, 15 ], "_babelType": "Identifier" }, "importKind": null, "local": { "type": "Identifier", "start": 9, "end": 15, "loc": { "start": { "line": 1, "column": 9 }, "end": { "line": 1, "column": 15 }, "identifierName": "protos" }, "name": "protos", "range": [ 9, 15 ], "_babelType": "Identifier" }, "range": [ 9, 15 ], "_babelType": "ImportSpecifier" } ], "importKind": "value", "source": { "type": "Literal", "start": 23, "end": 42, "loc": { "start": { "line": 1, "column": 23 }, "end": { "line": 1, "column": 42 } }, "extra": { "rawValue": "my_company_protos", "raw": "'my_company_protos'" }, "value": "my_company_protos", "range": [ 23, 42 ], "_babelType": "StringLiteral", "raw": "'my_company_protos'" }, "range": [ 0, 42 ], "_babelType": "ImportDeclaration" }, { "type": "ExportNamedDeclaration", "start": 44, "end": 80, "loc": { "start": { "line": 3, "column": 0 }, "end": { "line": 3, "column": 36 } }, "specifiers": [], "source": null, "exportKind": "type", "declaration": { "type": "TypeAlias", "start": 51, "end": 80, "loc": { "start": { "line": 3, "column": 7 }, "end": { "line": 3, "column": 36 } }, "id": { "type": "Identifier", "start": 56, "end": 60, "loc": { "start": { "line": 3, "column": 12 }, "end": { "line": 3, "column": 16 }, "identifierName": "User" }, "name": "User", "range": [ 56, 60 ], "_babelType": "Identifier" }, "typeParameters": null, "right": { "type": "GenericTypeAnnotation", "start": 63, "end": 79, "loc": { "start": { "line": 3, "column": 19 }, "end": { "line": 3, "column": 35 } }, "typeParameters": null, "id": { "type": "QualifiedTypeIdentifier", "start": 63, "end": 79, "loc": { "start": { "line": 3, "column": 19 }, "end": { "line": 3, "column": 35 } }, "qualification": { "type": "QualifiedTypeIdentifier", "start": 63, "end": 74, "loc": { "start": { "line": 3, "column": 19 }, "end": { "line": 3, "column": 30 } }, "qualification": { "type": "Identifier", "start": 63, "end": 69, "loc": { "start": { "line": 3, "column": 19 }, "end": { "line": 3, "column": 25 }, "identifierName": "protos" }, "name": "protos", "range": [ 63, 69 ], "_babelType": "Identifier" }, "range": [ 63, 74 ], "_babelType": "QualifiedTypeIdentifier" }, "range": [ 63, 79 ], "_babelType": "QualifiedTypeIdentifier" }, "range": [ 63, 79 ], "_babelType": "GenericTypeAnnotation" }, "range": [ 51, 80 ], "_babelType": "TypeAlias" }, "range": [ 44, 80 ], "_babelType": "ExportNamedDeclaration" } ] } 

рдкреЗрдбрд╝ рдХреА рдЬрдбрд╝ (рдкреНрд░рдХрд╛рд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдПрдХ рдиреЛрдб) рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рджреЛ рдСрдкрд░реЗрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВ - ImportDeclaration рдФрд░ ExportNamedDeclaration ред


ImportDeclaration рдореЗрдВ, рд╣рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджреЛ рдЧреБрдгреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ - рд╕реНрд░реЛрдд рдФрд░ рд╡рд┐рдирд┐рд░реНрджреЗрд╢рдХ , рдЬрд┐рд╕рдореЗрдВ рд╕реНрд░реЛрдд рдкрд╛рда рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реНрд░реЛрдд рдХрд╛ рдорд╛рди my_company_protos рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдЗрд╕ рдореВрд▓реНрдп рд╕реЗ рд╕рдордЭрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рд╣реИ рдпрд╛ рдмрд╛рд╣рд░реА рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд▓рд┐рдВрдХ рд╣реИред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдкрд╛рд░реНрд╕рд░ рдХрд░рддрд╛ рд╣реИред


рдЗрд╕реА рдкреНрд░рдХрд╛рд░, рд╕реЛрд░реНрд╕ рдХреА рдЬрд╛рдирдХрд╛рд░реА ExportNamedDeclaration рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред рдирд╛рдорд╕реНрдерд╛рди рдХреЗрд╡рд▓ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдордирдорд╛рдирд╛ рдШреЛрдВрд╕рд▓рд╛ рдЬреЛрдбрд╝рдХрд░ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ QualifiedTypeIdentifiers рд╣реЛрддреЗ рд╣реИрдВ ред рдпрд╣ рдПрдХ рдФрд░ рдХрд╛рд░реНрдп рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдкрд╛рд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рдЪреБрдиреЗ рд╣реБрдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рд╣рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рддрдХ рдЖрдпрд╛рдд рд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдВрдХрд▓реНрдк рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛ рдерд╛! рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкрд╛рд░реНрд╕рд░ рдФрд░ рдПрдПрд╕рдЯреА рд╕реНрд░реЛрдд рдкрд╛рда рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдорд┐рдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЕрдВрддрд┐рдо рдкреЗрдбрд╝ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рднреА рдЖрдпрд╛рддрд┐рдд рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЕрдкрдирд╛ рдЖрдпрд╛рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ!


рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╛рд░реНрд╕рд░ рдХреА рдорджрдж рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛, рд╣рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб рдорд┐рд▓рддрд╛ рд╣реИ ... рдЪрд▓реЛ рдПрдХ рдХрджрдо рд╡рд╛рдкрд╕ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рд╕реЛрдЪрддреЗ рд╣реИрдВред


рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЖрдпрд╛рдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕ рддрд░рд╣ рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рд╣рдо protos.user.User рдкреНрд░рдХрд╛рд░ рдХреА рд╕рднреА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдФрд░ рдЖрдпрд╛рдд рд╕рдВрджрд░реНрднреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрдиреНрд╣реЗрдВ рдПрдореНрдмреЗрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдФрд░ рдирдИ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╣рд╛рдБ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ?


TypeChecker


рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдкрд╛рд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдзрд╛рди рдЖрдпрд╛рддрд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рджреВрд╕рд░рд╛ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред


рдпрд╣рд╛рдБ рддреБрд░рдВрдд рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддрд╛ рд╣реИ:


TypeChecker рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХреА рдиреАрдВрд╡ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд╣ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдкрд╛рддреНрд░реЛрдВ рдХреА рдмрд╛рддрдЪреАрдд, рдкрд╛рддреНрд░реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдФрд░ рд╕рд┐рдореЗрдВрдЯрд┐рдХ рд╕рддреНрдпрд╛рдкрди (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддреНрд░реБрдЯрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ) рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред
рдкрд╣рд▓реА рдмрд╛рдд рдЯрд╛рдЗрдкрдХреЗрдЪрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдПрдХ рджреГрд╢реНрдп рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдФрд░ рдлрд┐рд░ рдПрдХ рд╣реА рд╡рд░реНрдг рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВ, рдПрдХ рд╣реА рд╡рд░реНрдг (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдирд╛рдорд╕реНрдерд╛рди) рдХреЛ рдорд┐рд▓рд╛рддреЗ рд╣реБрдПред
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЯрд╛рдЗрдкрдХреИрдЪрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рдЗрди рд╕рд╡рд╛рд▓реЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:
рдХреМрди рд╕рд╛ рдкреНрд░рддреАрдХ рдЗрд╕ рдиреЛрдб рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ?
рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддреАрдХ рд╣реИ?
рдПрдПрд╕рдЯреА рдХреЗ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ рдХреМрди рд╕реЗ рд╡рд░реНрдг рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реЗ рд╣реИрдВ?
рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ?
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП?

TypeChecker рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП! рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рдФрд░ рдПрдкреАрдЖрдИ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкрд╣рд▓реЗ рджреЛ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдЙрддреНрддрд░ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ: рдкреНрд░рддреАрдХ рдЗрд╕ рдиреЛрдб рд╕реЗ рдХреНрдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ? рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддреАрдХ рд╣реИ? рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп рд╡рд░реНрдгреЛрдВ рдХреЛ рдорд░реНрдЬ рдХрд░рдиреЗ рд╕реЗ, TypeChecker рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдирд╛рдо рд╕реНрдерд╛рди рдХреЗ рдЬрдорд╛рд╡ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛!


рддреЛ рдЖрдк рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ?


рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдореБрдЭреЗ рдиреЗрдЯ рдкрд░ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрдХреИрдЪрд░ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреА рджреЛ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ - checker.getSymbolAtLocation рдФрд░ checker.getTypeOfSymbolAtLocation , рдЬреЛ рд╣рдо рдЬрд┐рд╕ рдЪреАрдЬрд╝ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕рд╕реЗ рдмрд╣реБрдд рдорд┐рд▓рддреЗ-рдЬреБрд▓рддреЗ рд╣реИрдВред


рдХреЛрдб рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред


models.ts
 import { protos } from './my_company_protos' export type User = protos.user.User; 

my_company_protos.ts
 export namespace protos { export namespace user { export interface User { username: string; info: protos.Info.User; } } export namespace Info { export interface User { name: protos.Info.Name; } export interface Name { firstName: string; lastName: string; } } } 

TS-alias.ts
 import ts from "typescript"; // hardcode our input file const filePath = "./src/models.ts"; // create a program instance, which is a collection of source files // in this case we only have one source file const program = ts.createProgram([filePath], {}); // pull off the typechecker instance from our program const checker = program.getTypeChecker(); // get our models.ts source file AST const source = program.getSourceFile(filePath); // create TS printer instance which gives us utilities to pretty print our final AST const printer = ts.createPrinter(); // helper to give us Node string type given kind const syntaxToKind = (kind: ts.Node["kind"]) => { return ts.SyntaxKind[kind]; }; // visit each node in the root AST and log its kind ts.forEachChild(source, node => { console.log(syntaxToKind(node.kind)); }); 

 $ ts-node ./src/ts-alias.ts prints ImportDeclaration TypeAliasDeclaration EndOfFileToken 

рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдирд╛рдо рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:


рддрд░рд╣-printer.ts
 ts.forEachChild(source, node => { if (ts.isTypeAliasDeclaration(node)) { console.log(node.kind); } }) // prints TypeAliasDeclaration 

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдиреЛрдб рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рд╕рдЯреАрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдиреЛрдб рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ:



рдЕрдм рдЙрди рджреЛ рдкреНрд░рд╢реНрдиреЛрдВ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕рд╛рдордиреЗ рдЖрдП рдереЗ: рдХреМрди рд╕рд╛ рдкреНрд░рддреАрдХ рдЗрд╕ рдиреЛрдб рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ? рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддреАрдХ рд╣реИ?


рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдЯрд╛рдЗрдкрдХреИрдЪрд░ рдЪрд░рд┐рддреНрд░ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдХреЗ рдЯрд╛рдЗрдк рдЙрдкрдирд╛рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рдгрд╛рдУрдВ рдореЗрдВ рджрд░реНрдЬ рдирд╛рдо рдорд┐рд▓рд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо рдЕрднреА рднреА рдпрд╛рддреНрд░рд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рд╢реБрд░реБрдЖрдд рд╣реИ ред


рдЪреЗрдХрд░-example.ts
 ts.forEachChild(source, node => { if (ts.isTypeAliasDeclaration(node)) { const symbol = checker.getSymbolAtLocation(node.name); const type = checker.getDeclaredTypeOfSymbol(symbol); const properties = checker.getPropertiesOfType(type); properties.forEach(declaration => { console.log(declaration.name); // prints username, info }); } }); 

рдЕрдм рдХреЛрдб рдкреАрдврд╝реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВред


рдкрд░рд┐рд╡рд░реНрддрди рдПрдкреАрдЖрдИ


рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрд╛рд░реНрд╕ рдФрд░ рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╣реИ рдФрд░ рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛ рд╣реИред рдПрдПрд╕рдЯреА -> рдПрдПрд╕рдЯреА рд░реВрдкрд╛рдВрддрд░рдг рдЗрддрдиреА рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреАрдо рдиреЗ рдХрд╕реНрдЯрдо рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реЛрдЪрд╛ рд╣реИ!


рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рд╕рд░рд▓ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред рдЙрд╕рдХреЗ рд▓рд┐рдП рдореВрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдЬреЗрдореНрд╕ рдЧрд╛рд░реНрдмрдЯ рдХреЛ рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рджред


рдЪрд▓реЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддреЗ рд╣реИрдВред


рд╕рдВрдЦреНрдпрд╛-transformer.ts
 const source = ` const two = 2; const four = 4; `; function numberTransformer<T extends ts.Node>(): ts.TransformerFactory<T> { return context => { const visit: ts.Visitor = node => { if (ts.isNumericLiteral(node)) { return ts.createStringLiteral(node.text); } return ts.visitEachChild(node, child => visit(child), context); }; return node => ts.visitNode(node, visit); }; } let result = ts.transpileModule(source, { compilerOptions: { module: ts.ModuleKind.CommonJS }, transformers: { before: [numberTransformer()] } }); console.log(result.outputText); /* var two = "2"; var four = "4"; 

рдЗрд╕рдХрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ Visitor рдФрд░ VisitorResult :


 type Visitor = (node: Node) => VisitResult<Node>; type VisitResult<T extends Node> = T | T[] | undefined; 

рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдмрдирд╛рддреЗ рд╕рдордп рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рдЖрдЧрдВрддреБрдХ рд▓рд┐рдЦрдирд╛ рд╣реИред рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рдПрдПрд╕рдЯреА рдиреЛрдб рдХреЗ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЯреНрд░рд╛рд╡реЗрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдФрд░ рдПрдХ рдпрд╛рддреНрд░рд╛ рдкрд░рд┐рдгрд╛рдо (рдПрдХ, рдХрдИ, рдпрд╛ рд╢реВрдиреНрдп рдПрдПрд╕рдЯреА рдиреЛрдбреНрд╕) рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЖрдк рдЗрдиреНрд╡рд░реНрдЯрд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХреЗрд╡рд▓ рдЪрдпрдирд┐рдд рдиреЛрдбреНрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдВред


рдЗрдирдкреБрдЯ-output.ts
 // input export namespace protos { // ModuleDeclaration export namespace user { // ModuleDeclaration // Module Block export interface User { // InterfaceDeclaration username: string; // username: string is PropertySignature info: protos.Info.User; // TypeReference } } export namespace Info { export interface User { name: protos.Info.Name; // TypeReference } export interface Name { firstName: string; lastName: string; } } } // this line is a TypeAliasDeclaration export type User = protos.user.User; // protos.user.User is a TypeReference // output export interface User { username: string; info: { // info: { .. } is a TypeLiteral name: { // name: { .. } is a TypeLiteral firstName: string; lastName: string; } } } 

рдпрд╣рд╛рдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХрд┐рди рдиреЛрдбреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред


рдЖрдЧрдВрддреБрдХ рдХреЛ рджреЛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ:


  1. рдЗрдВрдЯрд░рдлрд╝реЗрд╕рдПрдХреНрд▓реЗрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдкрдЕрд▓реАрд╕рдбреЗрдХреНрд▓реЗрд░реЗрд╢рди рдХреА рдЬрдЧрд╣
  2. рдЯрд╛рдЗрдк рд░рд╛рдЗрдЯрд░реНрд╕ рдХреЛ рдЯрд╛рдЗрдк рд░рд╛рдЗрдЯрд░реНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛

рдирд┐рд░реНрдгрдп


рдпрд╣ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдХреЛрдб рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:


aliasTransformer.ts
 import path from 'path'; import ts from 'typescript'; import _ from 'lodash'; import fs from 'fs'; const filePath = path.resolve(_.first(process.argv.slice(2))); const program = ts.createProgram([filePath], {}); const checker = program.getTypeChecker(); const source = program.getSourceFile(filePath); const printer = ts.createPrinter(); const typeAliasToInterfaceTransformer: ts.TransformerFactory<ts.SourceFile> = context => { const visit: ts.Visitor = node => { node = ts.visitEachChild(node, visit, context); /* Convert type references to type literals interface IUser { username: string } type User = IUser <--- IUser is a type reference interface Context { user: User <--- User is a type reference } In both cases we want to convert the type reference to it's primitive literals. We want: interface IUser { username: string } type User = { username: string } interface Context { user: { username: string } } */ if (ts.isTypeReferenceNode(node)) { const symbol = checker.getSymbolAtLocation(node.typeName); const type = checker.getDeclaredTypeOfSymbol(symbol); const declarations = _.flatMap(checker.getPropertiesOfType(type), property => { /* Type references declarations may themselves have type references, so we need to resolve those literals as well */ return _.map(property.declarations, visit); }); return ts.createTypeLiteralNode(declarations.filter(ts.isTypeElement)); } /* Convert type alias to interface declaration interface IUser { username: string } type User = IUser We want to remove all type aliases interface IUser { username: string } interface User { username: string <-- Also need to resolve IUser } */ if (ts.isTypeAliasDeclaration(node)) { const symbol = checker.getSymbolAtLocation(node.name); const type = checker.getDeclaredTypeOfSymbol(symbol); const declarations = _.flatMap(checker.getPropertiesOfType(type), property => { // Resolve type alias to it's literals return _.map(property.declarations, visit); }); // Create interface with fully resolved types return ts.createInterfaceDeclaration( [], [ts.createToken(ts.SyntaxKind.ExportKeyword)], node.name.getText(), [], [], declarations.filter(ts.isTypeElement) ); } // Remove all export declarations if (ts.isImportDeclaration(node)) { return null; } return node; }; return node => ts.visitNode(node, visit); }; // Run source file through our transformer const result = ts.transform(source, [typeAliasToInterfaceTransformer]); // Create our output folder const outputDir = path.resolve(__dirname, '../generated'); if (!fs.existsSync(outputDir)) { fs.mkdirSync(outputDir); } // Write pretty printed transformed typescript to output directory fs.writeFileSync( path.resolve(__dirname, '../generated/models.ts'), printer.printFile(_.first(result.transformed)) ); 

рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИ рдХрд┐ рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдпрд╣ рдЕрдиреНрдп рдХреБрд╢рд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рдЕрдЪреНрдЫреЗ рд╕рд╛рд░, рдПрдХ рдмреБрджреНрдзрд┐рдорд╛рди рд╕рдВрдХрд▓рдХ, рдЙрдкрдпреЛрдЧреА рд╡рд┐рдХрд╛рд╕ рдЙрдкрдХрд░рдг (рд╕реНрд╡рддрдГ рдкреВрд░реНрдгрддрд╛ VSCode, рдПрдПрд╕рдЯреА рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░, рдЖрджрд┐) рдФрд░ рдЕрдиреБрднрд╡ рдХреЗ рдмрд┐рдЯреНрд╕ рдХреА рд╢рдХреНрддрд┐ рдХрд╛ рдкреНрд░рддреАрдХ рд╣реИред рдЕрдкрдбреЗрдЯ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рдирд┐рдЬреА рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдореИрдВ рд╕рд┐рд░реНрдл рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдЯреВрд▓рдХрд┐рдЯ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдФрд░ рдПрдХ рдЧреИрд░-рдорд╛рдирдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдХрд╛рдЧрдЬ рдкрд░ рдбрд╛рд▓ рджрд┐рдпрд╛ рдЬреЛ рдореБрдЭреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рдерд╛ред


рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдХрд┐рд╕реА рдХреЛ рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдПрдПрд╕рдЯреА, рд╕рдВрдХрд▓рдХ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рд╡рд┐рд╖рдп рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ, рддреЛ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдЬреЛ рдореИрдВрдиреЗ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдерд╛, рдЙрдиреНрд╣реЗрдВ рдЖрдкрдХреА рдорджрдж рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдордп рдмрд┐рддрд╛рдирд╛ рдкрдбрд╝рд╛ рддрд╛рдХрд┐ рдЕрдВрдд рдореЗрдВ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓ рд╕рдХреЗред 45 // @ts-ignores рдФрд░ рдореБрдЦрд░ рд╕рд╣рд┐рдд рдирд┐рдЬреА рдЧрд┐рддреБрдм рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдореЗрд░реЗ рдкрд╣рд▓реЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдиреЗ рдореБрдЭреЗ рд╢рд░реНрдо рд╕реЗ рд▓рд╛рд▓ рдХрд░ рджрд┐рдпрд╛ред


рд╕рдВрд╕рд╛рдзрди рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдореЗрд░реА рдорджрдж рдХреА:


Microsoft / рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ


рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдмрдирд╛рдирд╛


рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ API рдкрд░ рджреЛрдмрд╛рд░рд╛ рдЧреМрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛


рдПрдПрд╕рдЯреА рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░

Source: https://habr.com/ru/post/hi457770/


All Articles