TIL/TypeScript

[TypeScript] 이펙티브 타입스크립트 item 38~44

JoJobum 2022. 8. 5.

item38

any 타입은 가능한 좁은 법위에서만 사용하기

any는 매우 강력한 힘 가짐 (큰 힘에는 큰 책임이...)

 

// 1
function f1(){
    const x: any = f3();
    f4(x);
}

// 2
function f1(){
    const x = f3();
    f4(x as any);
}

1번 보다 2번 케이스가 더 나음, 왜냐하면 any 타입이 f4() 의 매개변수로만 들어가고 다른 곳엔 영향을 끼치지 않았기에

함수에서 any를 반환하면 영향력이 더 퍼져나감 => 반환 타입 any로 하는 것 지양할 것 + 반환 타입을 명시하는 것이 좋음

 

item39

any를 구체적으로 변형해서 사용하기

// 1: any 타입의 값 그대로 넣기
function getLength(array: any){
    return array.length;
}

// 2: any 타입 구체화함 
function getLength(array: any[]){
    return array.length;
}

2번이 더 좋은 이유는 

  • 함수 내의 array.length 타입이 체크됨
  • 함수의 반환 타입이 any 대신 number로 추론됨
  • 함수 호출될 때 매개변수가 배열인지 체크됨

=> 2번은 1번과 다르게 배열이 아닌 값을 넣으면 오류를 잡아낼 수 있음 

 

item40

함수 안으로 타입 단언문 감추기

객체가 같은지 체크하기 위해 객체 순회와 단언문은 별도의 함수로 분리해주는 것이 좋음

 

item41

any의 진화 이해하기

const result = []; // 타입이 any[]
result.push('a'); // 타입이 string[]
result.push(1); // 타입이 (string | number)[]

위처럼 any 타입의 진화는 noImplicitAny가 설정된 상태 즉 타입이 암시적으로 any로 추론된 경우만,

명시적으로 any를 선언했다면 any로 유지된다.

 

item42

모르는 타입의 값에는 any 대신 unknown 사용하기 

 

any는 

  • 어떤 타입이든 any로 할당 가능
  • any는 어떤 타입으로도 할당 가능

unknown은 

  • 어떤 타입이든 unknown 으로 할당 가능
  • unknown은 오직 unknow과 any에서만 할당 가능

never은

  • 어떤 타입이든  never 으로 할당 불가능
  • never는 어떤 타입으로도 할당 가능

 

unknown은 값은 있지만 타입을 알지 못하는 경우 any 대신 사용할 수 있는 안전한 타입

 

item43

몽키  패치보다는 안전한 타입을 사용하기

 

전역 변수나 DOM에 데이터 저장말고, 데이터를 분리하여 사용할 것

내장 타입에 데이터를 저장해야 하는 경우, 안전한 타입 접근법 중 하나(보강이나 사용자 정의 인터페이스로 단언)를 사용할 것

 

item44

타입 커버리지를 추적하여 타입 안전성 유지

noImplicityAny 사용해도 명시적 any 혹은 서드파티 타입 선언을 통해 any 타입이 코드내에 존재할 수 있다는 점 유의할 것

반응형

댓글