Resolved
Written on
·
54
·
Edited
0
console.log("Hello TypeScript");
const a: number = "1";
console.log(typeof a)
위와 같이 index.ts파일에서 number타입에 문자열 값을 집어넣게 되면
vscode 에서 Type 'string' is not assignable to type 'number'.ts(2322) 라는 오류를 발생시키지만
tsc로 실행하면 오류는 발생하지만 아래와 같이 js확장자로 컴파일이 진행됩니다.
console.log("Hello TypeScript");
var a = "1";
console.log(typeof a);
또한 tsx로 실행하면 오류없이 모두 출력됩니다.
두번째 콘솔에서는 a의 타입을 string으로 출력시키구요.
컴파일 과정중 타입검사를 진행해 오류가 발생하지 않을 경우 js로 변환한 뒤 node에서 실행하는 과정으로 알고있는데, 이게 왜 오류가 발생하지 않고 자연스럽게 tsc와 tsx가 실행되는것인지 궁금합니다.
Answer 2
0
안녕하세요 이정환입니다.
우선 TypeScript 컴파일러의 동작은 tsconfig.json에 설정하는 옵션에 따라 유동적으로 변경될 수 있습니다. 따라서 기본적으로 아무 옵션도 커스텀 하지 않은 경우 말씀하신 것 처럼 타입 체킹시 오류가 발생하더라도 JS 파일로 컴파일은 완료됩니다. (타입 체킹은 동일하게 이루어집니다)
그러나 이렇게 되면 타입스크립트를 사용해 보다 견고한 프로그램을 작성하기 어려워지므로 보통의 Vite, Webpack 등을 사용하는 프로덕션에서는 타입체킹 에러 발생시 컴파일 결과로 JS 파일을 생성하지 않도록 하고 있습니다. 그리고 이를 명시적으로 설정하는 옵션은 noEmitOnError입니다.
따라서 다음과 같이 tsconfig.json의 compilerOptions를 설정하신 다음 다시 tsc로 컴파일 해 보시면 타입 에러 발생시 js 파일로 컴파일 되지 않을 것 입니다.
{
"compilerOptions": {
"noEmitOnError": true
}
}
0
안녕하세요, 인프런 AI 인턴입니다.
유재혁님께서 말씀하신 상황은 TypeScript가 제공하는 타입 검사와 관련된 것입니다. TypeScript는 타입 검사기(linter)를 통해 코드를 작성할 때 즉각적인 피드백을 제공합니다. 이는 개발 환경에서 타입 오류를 확인할 수 있지만, 실제 실행 시에는 JavaScript로 코드가 컴파일되며, 이 과정에서 타입 오류가 발생해도 JavaScript의 특성상 런타임에 오류 없이 실행될 수 있습니다.
주어진 코드:
console.log("Hello TypeScript");
const a: number = "1";
console.log(typeof a);
위 코드에서 TypeScript 타입 시스템에서는 a
에 문자열 "1"
을 할당하는 것이 문제라고 경고합니다. 하지만, tsx
또는 tsc
명령어를 사용할 때 타입 에러가 발생하더라도 코드가 JavaScript로 변환되어 동작하게 됩니다. 이는 TypeScript가 런타임 타입 시스템이 아니기 때문입니다.
타입 검사: TypeScript는 오직 컴파일 시간에 타입 검사를 합니다. 즉, 컴파일러는 런타임 오류를 방지하기 위해 타입 안전성을 제공합니다. 컴파일러가 경고를 하지만, 컴파일은 여전히 성공하여 JavaScript 파일이 생성됩니다.
컴파일 옵션: 일부 컴파일러 옵션에 따라 행동이 다릅니다. 예를 들어, tsconfig.json
에서 "noEmitOnError": true
옵션을 추가하면 타입 에러가 있을 때 JavaScript 파일이 생성되지 않도록 할 수 있습니다.
비슷한 문제를 겪은 다른 사용자의 질문과 답변 링크를 참고해 보시면 도움이 될 것입니다:
이 링크들에서 TypeScript의 실행 및 설정 관련 문제들을 다루고 있으며, 타입 검사와 컴파일 과정에 대한 추가적인 팁을 얻으실 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.