사용자 정의 변환기 및 코드 생성
AST를 수정하는 컴파일러 변환을 작성합니다.
사용자 정의 변환기 및 코드 생성은(는) CoddyKit의 무료 TypeScript Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 TypeScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
변환기란 무엇입니까?
TypeScript 변환기는 AST 노드를 받아 (수정되었을 수도 있는) 노드를 반환하는 함수입니다. 컴파일 중에 실행되어 사용자 지정 출력을 생성합니다.
import ts from "typescript";
type Transformer = ts.TransformerFactory<ts.SourceFile>;변환기 팩토리 형태
변환기 팩토리는 TransformationContext를 받아 SourceFile 노드를 변환하는 함수를 반환합니다.
const myTransformer: ts.TransformerFactory<ts.SourceFile> =
(ctx) => (sf) => {
function visit(node: ts.Node): ts.Node {
// Modify node here
return ts.visitEachChild(node, visit, ctx);
}
return ts.visitNode(sf, visit) as ts.SourceFile;
};컨텍스트를 사용한 방문
ts.visitEachChild는 (forEachChild가 아니라) 변환기 내부에서 사용합니다. 수정된 노드를 올바르게 재구성하기 때문입니다.
function visit(node: ts.Node): ts.Node {
if (ts.isStringLiteral(node)) {
return ts.factory.createStringLiteral(node.text.toUpperCase());
}
return ts.visitEachChild(node, visit, ctx);
}ts.factory를 사용하여 새 노드 만들기
ts.factory 객체는 모든 종류의 AST 노드를 생성하는 메서드를 제공합니다.
const newCall = ts.factory.createCallExpression(
ts.factory.createIdentifier("console.log"),
undefined,
[ts.factory.createStringLiteral("hello")]
);프로그램에 변환기 적용하기
customTransformers 옵션을 통해 변환기를 program.emit에 전달합니다.
program.emit(undefined, undefined, undefined, false, {
before: [myTransformer],
});코드 생성: 노드 출력하기
전체 컴파일러를 실행하지 않고 AST 노드를 소스 코드 문자열로 다시 변환하려면 ts.createPrinter를 사용합니다.
const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
const result = printer.printNode(
ts.EmitHint.Unspecified,
newCall,
sf
);
console.log(result); // console.log("hello")전체 소스 파일 생성하기
ts.factory.createSourceFile을 사용하거나 문 노드 목록을 조합하여 처음부터 완전한 소스 파일을 만들 수 있습니다.
const statements = [
ts.factory.createExpressionStatement(
ts.factory.createCallExpression(
ts.factory.createIdentifier("console.log"),
undefined,
[ts.factory.createStringLiteral("generated!")]
)
),
];가져오기 변환하기
가져오기 경로를 변환하는 것은 일반적인 사용 사례입니다. 예를 들어 출력 시점에 별칭이 지정된 경로를 상대 경로로 다시 작성할 수 있습니다.
if (ts.isImportDeclaration(node)) {
const spec = node.moduleSpecifier as ts.StringLiteral;
if (spec.text.startsWith("@app/")) {
return ts.factory.updateImportDeclaration(
node, node.modifiers, node.importClause,
ts.factory.createStringLiteral(spec.text.replace("@app/", "../")),
node.assertClause
);
}
}변환기 테스트하기
변환기를 작은 소스 파일에 적용하고 출력된 결과가 예상 문자열과 일치하는지 단언하여 테스트합니다.
const result = ts.transpileModule("const x = 'hello';", {
compilerOptions: { target: ts.ScriptTarget.ES2020 },
transformers: { before: [myTransformer] },
});
console.log(result.outputText);플러그인 시스템
일부 빌드 도구(예: ttypescript / ts-patch)를 사용하면 TypeScript 설정에 변환기를 플러그인으로 등록할 수 있어 개발 작업 흐름에서 변환기가 보이지 않게 작동합니다.
// tsconfig.json with ts-patch:
// "plugins": [{ "transform": "./my-transformer.js" }]요약: 사용자 지정 변환기
변환기를 사용하면 컴파일 중에 AST 수준에서 TypeScript 코드를 다시 작성할 수 있습니다. 재귀적 순회에는 ts.visitEachChild를, 노드 생성에는 ts.factory를, 소스 텍스트 생성에는 ts.createPrinter를 사용합니다.
빠른 확인
변환기에서 새 AST 노드를 만들 때 사용하는 객체는 무엇입니까?
학습 내용
사용자 지정 변환기는 컴파일 시 TypeScript AST를 수정합니다. 재귀에는 ts.visitEachChild를, 새 노드 생성에는 ts.factory를, 적용에는 customTransformers와 함께 program.emit을 사용합니다.
자주 묻는 질문
“사용자 정의 변환기 및 코드 생성” 강의는 무료인가요?
네 — “사용자 정의 변환기 및 코드 생성” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 TypeScript Academy 강의 전체를 잠금 해제할 수 있습니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“사용자 정의 변환기 및 코드 생성”에서 뭘 배우나요?
AST를 수정하는 컴파일러 변환을 작성합니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
TypeScript Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 TypeScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“사용자 정의 변환기 및 코드 생성” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 TypeScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 TypeScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- API로 TypeScript 프로그램 만들기
- 방문자로 AST 순회하기
- 사용자 정의 변환기 및 코드 생성
- 간단한 린팅 도구 만들기