any의 진화를 이해하기정제되지만 any는 진화한다.any의 진화는 값을 할당하거나 배열에 요소를 넣은 후에만 일어난다.any타입이 진화했더라도 변수가 할당된 줄에 타입은 여전히 any이다.any를 진화시키는 방식보다 명시적 타입 구문을 사용하는 것이 안전한 타입을 유지하는 방법이다.any대신 unknown을 사용하기interface Book {
name: string;
author: string;
}
function parseYAML(yaml: string): unknown {
// ...
}
const book = parseYAML(`
name: Wuthering Heights
author: Emily Bronte
`);
// 에러: unknown은 사용할 수 없음
book('');
unknown은 any대신 사용할 수 있는 안전한 타입이다.
any는 어떠한 타입도 할당 가능하기 때문에 타입 체커가 의미가 없다.unknown은 어떠한 타입이든 unknown에 할당할 수 있지만 unknown은 오직 any에만 할당가능하기 때문에 타입시스템에서 보다 명확히 오류를 잡아낼 수 있다.{}과 object는 null과 undefined를 제외한 모든 값을 포함한다.
null과 undefined가 불가능하다고 판단되는 경우만 unknown대신 {}를 사용하라.몽키패치(Monkey Patch): 런타임 중인 프로그램 메모리의 소스 내용을 직접 바꾸는 것
몽키패치의 어원:
게릴라 패치(guerrilla patch) ->고릴라 패치(gorilla patch) ->원숭이 패치(monkey Patch)
내장 타입에 데이터를 저장(몽키 패치)해야 하는 경우 아래와 같은 해결책이 있다.
interface 보강(argmentation)interface Document {
monkey: string;
}
document.monkey = 'Ta';
interface MonkeyDocument extends Document {
monkey: string;
}
(document as MonkeyDocument).monkey = 'Macaque';
noImplicitAny가 설정되어 있어도, 명시적 any 또는 서드파티 타입 선언(@types)를 통해 any타입은 코드 내에 존재할 수 있다.
아래 명령어를 통해 프로젝트의 n개 심벌 중 m개가 any가 아니거나 any의 별칭이 아닌 타입을 가지고 있음을 알 수 있다.
npx type-coveragenpx type-coverage --detaildevDependencies에 typescript와 @types추가하기devDependencies에 추가하여 팀원들이 동일한 TS버전을 사용할 수 있도록 해야한다.@types의 의존성은 devDependencies에 포함시켜야 한다.@types 선언 자체에서 타입 오류 발생@types의 버전이 맞지 않는 경우 문제 발생@types도 업데이트 한다.타입선언을 라이브러리에 포함하는 것과
DefinitelyTyped에 공개하는 것 사이의 장단점을 이해해야한다.TS로 작성된 라이브러리라면 타입 선언을 자체적으로 포함하고,
JS로 작성도니 라이브러리라면 타입 선언을
DefinitelyTyped에 공개하는 것이 좋다.
@params, @returns 구문과 문서 서식을 위해 마크다운을 사용할 수 있다.this는 동적 바인딩되는 자기 참조 변수이므로 코드를 예측하기 어렵게 한다.this를 사용해야 한다면, 타입 정보를 명시해야한다.function double<T extends number | string>(
x: T
): T extends string ? string : number;
function double(x: any) {
return x + x;
}