рдЯреЗрд╕реНрдЯрдореЗрд╕ рдЯреАрдо рдЖрдкрдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдЖ рдЧрдИ рд╣реИред рдЗрд╕ рдмрд╛рд░ рд╣рдо рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рд░реВрдкрд╛рдВрддрд░рдг рдкрд░ рдПрдХ рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЕрдЪреНрдЫрд╛ рдкрдврд╝ рд▓реЛ!
рдкрд░рд┐рдЪрдп
рдпрд╣ рдореЗрд░реА рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЗрд╕ рдмрд╣реБрдд рд╣реА рд╕рдорд╛рдзрд╛рди рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрдИ рдмреНрд▓реЙрдЧреЛрдВ рдореЗрдВ рджреЗрд░реА рдХреА рдФрд░ рд╕реНрдЯреИрдХрдСрд╡рд░рдлреНрд▓реЛ рдкрд░ рдЬрд╡рд╛рдм рдкрдЪрд╛рдпрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЙрд╕реА рднрд╛рдЧреНрдп рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕рдм рдХреБрдЫ рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА, рд▓реЗрдХрд┐рди рдЦрд░рд╛рдм рджрд╕реНрддрд╛рд╡реЗрдЬ рд╡рд╛рд▓реЗ рдЯреВрд▓рдмреЙрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрд╛ред
рдореБрдЦреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдБ
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдкреАрдЖрдИ (рдкрд╛рд░реНрд╕рд░ рд╢рдмреНрджрд╛рд╡рд▓реА, рдкрд░рд┐рд╡рд░реНрддрди рдПрдкреАрдЖрдИ, рд╕реНрддрд░рд┐рдд рд╡рд╛рд╕реНрддреБрдХрд▓рд╛), рд╕рд╛рд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреЗрдбрд╝ (рдПрдПрд╕рдЯреА), рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди, рдХреЛрдб рдкреАрдврд╝реА рдХреА рдореВрд▓ рдмрд╛рддреЗрдВред
рдЫреЛрдЯреА рд╕рд┐рдлрд╛рд░рд┐рд╢
рдпрджрд┐ рдпрд╣ рдПрдПрд╕рдЯреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреА рдкрд╣рд▓реА рдмрд╛рд░ рд╕реБрдирд╡рд╛рдИ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдХреЛ @Vahihi рдЬреЛрд╢реА рджреНрд╡рд╛рд░рд╛ рдкрдврд╝рдиреЗ рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛ ред рдмреЗрд╕рдХ рдХреЗ рд▓реЗрдЦреЛрдВ рдХреА рдЙрд╕рдХреА рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдирд┐рдХрд▓реА, рдЖрдкрдХреЛ рдмрд╣реБрдд рдкрд╕рдВрдж рдЖрдПрдЧреА ред
рдХрд╛рд░реНрдп рд╡рд┐рд╡рд░рдг
рдПрд╡реЗрд░реЛ рдореЗрдВ, рд╣рдо рдЧреНрд░рд╛рдлрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдПрдХ рдмрд╛рд░ рдЬрдм рдореИрдВ рдЧреНрд░реЗрдлреНрд▓рдЬреЗрди рдХреЗ рдкрд╛рд░ рдЖрдпрд╛, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдореЗрдВ рдореЙрдбрд▓ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдпрд╣рд╛рдБ рдирд╣реАрдВ рджреВрдВрдЧрд╛ - рдЗрд╕рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореЙрдбрд▓ рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЧреНрд░рд╛рдлрдХрд▓реНрдЬреЗрди рдореЗрдВ рдпреЗ рдореЙрдбрд▓ рдПрдХ рддрд░рд╣ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди (YAML рдпрд╛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВред
рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди, рд╣рдо gRPC рдорд╛рдЗрдХреНрд░реЛрд╕реЙрд░реНрдХреНрд╕ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП GQL рдПрдХ рдореБрдЦреМрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдкреНрд░реЛрдЯреЛ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯреНрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣реИрдВ, рдФрд░ рдореИрдВ рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдирд┐рд░реНрдпрд╛рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рдХрд╛рд░рдг рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ рдФрд░ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рд╡рд┐рд╡рд░рдг рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЬрдорд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ) рд╕рдВрджрд░реНрдн)ред
рдУрдкрди рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рд╕реНрд╡рд░ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рдХрджрдо рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдерд╛ рдХрд┐ рдЧреНрд░реЗрдлреНрд▓рдЧреЗрди рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдореЗрд░рд╛ рд╕рд╛рд░реНрдердХ рдпреЛрдЧрджрд╛рди рд╣реИред рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЧреНрд░рд╛рдлрдХреНрд▓реЗрди рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╛рдореЛрдВ рдФрд░ рдШреЛрд╖рдгрд╛рдУрдВ (рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдлрд╝реАрд▓реНрдб) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @ рдмреИрдмреЗрд▓ / рдкрд╛рд░реНрд╕рд░ рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рд╣рд░ рдмрд╛рд░ рдЬрдм рдореБрдЭреЗ рдПрдПрд╕рдЯреА рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдореИрдВ рдкрд╣рд▓реЗ astexplorer.net рдЦреЛрд▓рддрд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ рдЕрднрд┐рдирдп рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВ ред рдпрд╣ рдЙрдкрдХрд░рдг рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдкрд╛рд░реНрд╕рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдПрдПрд╕рдЯреА рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдмреЗрдмрд▓ / рдкрд╛рд░реНрд╕рд░ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд╛рд░реНрд╕рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред Astexplorer.net рдХреЗ рд╕рд╛рде, рдЖрдк рдЙрди рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдирдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рд░реНрд╕рд░ рдХреЗ рдПрдПрд╕рдЯреА рдиреЛрдбреНрд╕ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рд╣реИред
рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдлрд╝рд╛рдЗрд▓ рдФрд░ рдПрдПрд╕рдЯреА рдХреЛ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрд╛рдмреЗрд▓-рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЗрдЦреЗрдВред
example.tsimport { 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";
$ ts-node ./src/ts-alias.ts prints ImportDeclaration TypeAliasDeclaration EndOfFileToken
рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдирд╛рдо рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
рддрд░рд╣-printer.ts ts.forEachChild(source, node => { if (ts.isTypeAliasDeclaration(node)) { console.log(node.kind); } })
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдиреЛрдб рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рд╕рдЯреАрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдиреЛрдб рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

рдЕрдм рдЙрди рджреЛ рдкреНрд░рд╢реНрдиреЛрдВ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕рд╛рдордиреЗ рдЖрдП рдереЗ: рдХреМрди рд╕рд╛ рдкреНрд░рддреАрдХ рдЗрд╕ рдиреЛрдб рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ? рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддреАрдХ рд╣реИ?
рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдЯрд╛рдЗрдкрдХреИрдЪрд░ рдЪрд░рд┐рддреНрд░ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдХреЗ рдЯрд╛рдЗрдк рдЙрдкрдирд╛рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рдгрд╛рдУрдВ рдореЗрдВ рджрд░реНрдЬ рдирд╛рдо рдорд┐рд▓рд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо рдЕрднреА рднреА рдпрд╛рддреНрд░рд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рд╢реБрд░реБрдЖрдд рд╣реИ ред
рдЪреЗрдХрд░-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);
рдЕрдм рдХреЛрдб рдкреАрдврд╝реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрд╛рд░реНрд╕ рдФрд░ рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╣реИ рдФрд░ рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛ рд╣реИред рдПрдПрд╕рдЯреА -> рдПрдПрд╕рдЯреА рд░реВрдкрд╛рдВрддрд░рдг рдЗрддрдиреА рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреАрдо рдиреЗ рдХрд╕реНрдЯрдо рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реЛрдЪрд╛ рд╣реИ!
рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рд╕рд░рд▓ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред рдЙрд╕рдХреЗ рд▓рд┐рдП рдореВрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдЬреЗрдореНрд╕ рдЧрд╛рд░реНрдмрдЯ рдХреЛ рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рджред
рдЪрд▓реЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддреЗ рд╣реИрдВред
рд╕рдВрдЦреНрдпрд╛-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);
рдЗрд╕рдХрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ Visitor
рдФрд░ VisitorResult
:
type Visitor = (node: Node) => VisitResult<Node>; type VisitResult<T extends Node> = T | T[] | undefined;
рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдмрдирд╛рддреЗ рд╕рдордп рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рдЖрдЧрдВрддреБрдХ рд▓рд┐рдЦрдирд╛ рд╣реИред рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рдПрдПрд╕рдЯреА рдиреЛрдб рдХреЗ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЯреНрд░рд╛рд╡реЗрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдФрд░ рдПрдХ рдпрд╛рддреНрд░рд╛ рдкрд░рд┐рдгрд╛рдо (рдПрдХ, рдХрдИ, рдпрд╛ рд╢реВрдиреНрдп рдПрдПрд╕рдЯреА рдиреЛрдбреНрд╕) рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЖрдк рдЗрдиреНрд╡рд░реНрдЯрд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХреЗрд╡рд▓ рдЪрдпрдирд┐рдд рдиреЛрдбреНрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдВред
рдЗрдирдкреБрдЯ-output.ts рдпрд╣рд╛рдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХрд┐рди рдиреЛрдбреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред
рдЖрдЧрдВрддреБрдХ рдХреЛ рджреЛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ:
- рдЗрдВрдЯрд░рдлрд╝реЗрд╕рдПрдХреНрд▓реЗрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдкрдЕрд▓реАрд╕рдбреЗрдХреНрд▓реЗрд░реЗрд╢рди рдХреА рдЬрдЧрд╣
- рдЯрд╛рдЗрдк рд░рд╛рдЗрдЯрд░реНрд╕ рдХреЛ рдЯрд╛рдЗрдк рд░рд╛рдЗрдЯрд░реНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛
рдирд┐рд░реНрдгрдп
рдпрд╣ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдХреЛрдб рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
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); if (ts.isTypeReferenceNode(node)) { const symbol = checker.getSymbolAtLocation(node.typeName); const type = checker.getDeclaredTypeOfSymbol(symbol); const declarations = _.flatMap(checker.getPropertiesOfType(type), property => { return _.map(property.declarations, visit); }); return ts.createTypeLiteralNode(declarations.filter(ts.isTypeElement)); } if (ts.isTypeAliasDeclaration(node)) { const symbol = checker.getSymbolAtLocation(node.name); const type = checker.getDeclaredTypeOfSymbol(symbol); const declarations = _.flatMap(checker.getPropertiesOfType(type), property => {
рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИ рдХрд┐ рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдпрд╣ рдЕрдиреНрдп рдХреБрд╢рд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рдЕрдЪреНрдЫреЗ рд╕рд╛рд░, рдПрдХ рдмреБрджреНрдзрд┐рдорд╛рди рд╕рдВрдХрд▓рдХ, рдЙрдкрдпреЛрдЧреА рд╡рд┐рдХрд╛рд╕ рдЙрдкрдХрд░рдг (рд╕реНрд╡рддрдГ рдкреВрд░реНрдгрддрд╛ VSCode, рдПрдПрд╕рдЯреА рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░, рдЖрджрд┐) рдФрд░ рдЕрдиреБрднрд╡ рдХреЗ рдмрд┐рдЯреНрд╕ рдХреА рд╢рдХреНрддрд┐ рдХрд╛ рдкреНрд░рддреАрдХ рд╣реИред рдЕрдкрдбреЗрдЯ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рдирд┐рдЬреА рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдореИрдВ рд╕рд┐рд░реНрдл рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдЯреВрд▓рдХрд┐рдЯ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдФрд░ рдПрдХ рдЧреИрд░-рдорд╛рдирдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдХрд╛рдЧрдЬ рдкрд░ рдбрд╛рд▓ рджрд┐рдпрд╛ рдЬреЛ рдореБрдЭреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рдерд╛ред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдХрд┐рд╕реА рдХреЛ рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдПрдПрд╕рдЯреА, рд╕рдВрдХрд▓рдХ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рд╡рд┐рд╖рдп рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ, рддреЛ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдЬреЛ рдореИрдВрдиреЗ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдерд╛, рдЙрдиреНрд╣реЗрдВ рдЖрдкрдХреА рдорджрдж рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдордп рдмрд┐рддрд╛рдирд╛ рдкрдбрд╝рд╛ рддрд╛рдХрд┐ рдЕрдВрдд рдореЗрдВ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓ рд╕рдХреЗред 45 // @ts-ignores
рдФрд░ рдореБрдЦрд░ рд╕рд╣рд┐рдд рдирд┐рдЬреА рдЧрд┐рддреБрдм рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдореЗрд░реЗ рдкрд╣рд▓реЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдиреЗ рдореБрдЭреЗ рд╢рд░реНрдо рд╕реЗ рд▓рд╛рд▓ рдХрд░ рджрд┐рдпрд╛ред
рд╕рдВрд╕рд╛рдзрди рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдореЗрд░реА рдорджрдж рдХреА:
Microsoft / рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдмрдирд╛рдирд╛
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ API рдкрд░ рджреЛрдмрд╛рд░рд╛ рдЧреМрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛
рдПрдПрд╕рдЯреА рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░