다음의 코드가 오류없이 타입 체커를 통과할 수 있는지 생각해보자
function(){
return a + b;
}
add(10 ,null);
타입스크립트의 설정을 알기 전까지는 대답할 수 없다.
타입스크립트 컴파일러는 매우 많은 설정을 가지고 있다. (100개가 넘음 ㄷㄷ)
또한 이 설정들은 커맨드 라인에서 사용할 수가 있다.
$ tsc --noImplicitAny program.ts
또는 tsconfig.json 설정 파일을 통해서도 가능하다.
{
"compilerOptions":{
"noImplicitAny": true
}
}
가급적 설정 파일을 사용하는 것을 추천한다. 그래야만 타입스크립트를 어떻게 사용할 계획인지 동료들이나 다른 도구들이 알 수 있다.
tsc --init
실행으로 쉽고 간단하게 생성이 가능하다.설정은 대부분 어디서 소스 파일을 찾을지, 어떤 종류의 출력을 생성할지 제어하는 내용이 대부분이다.
🙋🏻♂️ 대부분의 언어에서는 허용하지 않는 고수준 설계 설정인, 언어 자체의 핵심 요소들을 제어하는 설정도 있다!
설정을 제대로 사용하려면, noImplicitAny와 stricNullChecks를 이해해야 한다.
다음 코드는 noImplicitAny가 해제되어 있을 때, 유효한 코드이다.
function add(a, b){
return a + b;
}
편집기에서 add 부분에 마우스를 올려 보면, 타입스크립트에서 추론한 타입을 알 수 있다.
function add(a: any, b: any): any
any 타입을 매개변수에 사용하면 타입 체커는 의미가 없어진다.
따라서 any는 만능같아 보이지만 매우 주의해서 사용 할 필요가 있다.
function add(a, b){
// 'a' 매개변수에는 암묵적으로 'any'형식이 포함됩니다.
// 'b' 매개변수에는 암묵적으로 'any'형식이 포함됩니다.
return a + b;
}
any를 코드에 넣지 않았지만, any타입으로 간주되기 때문에 이를 '암시적 any'라고 부른다.
function add(a: number, b: number){
return a + b;
}
그런데 같은 코드임에도 noImplicitAny가 설정되어 있다면 오류가 된다.
이 오류들은 명시적으로 : any라고 선언을 하거나, 더 분명한 타입을 사용해야만 해결할 수 있다.
타입스크립트는 타입 정보를 가질 때 가장 효과적이기 때문에, 되도록 noImplicitAny를 설정해야 한다. 그렇게 하면 코드의 가독성이 좋아지고, 문제의 발견이 수월해지며 개발자의 생산성이 향상된다.
stricNullChecks는 null과 undefined가 모든 타입에서 허용되는지 확인하는 설정이다.
const x: number = null; // 정상, null은 유효한 값입니다.
그러나 stricNullChecks를 설정하면 오류가 난다.
const x: number = null;
// 'null' 형식은 'number' 형식에 할당할 수 없습니다.
null대신에 undefined를 써도 같은 오류가 난다. 만약 null을 사용하려고 한다면, 아래와 같이 의도를 명시적으로 드러내야한다.
const x: number | null = null;
만약 null을 허용하지 않으려면, 이 값이 어디서부터 왔는지 찾아야하고, null을 체크하는 코드나 단언문(assertion)을 추가해야 한다.
타입스크립트 컴파일러는 언어의 핵심 요소에 영향을 미치는 몇 가지 설정을 포함하고 있다.
타입스크립트 설정은 커맨드 라인을 이용하기보다는 tsconfig.json을 사용하는 것이 좋다.
자바스크립트 프로젝트를 타입스크립트로 전환하는게 아니라면 프로젝트 초기설정으로 noImplicitAny를 설정하는 것이 좋다.
'undefined는 객체가 아닙니다.'와 같은 런타임 오류 방지를 위해서, stricNullChecks를 설정하는 것이 좋다.