#41 any의 진화를 이해하기

2023. 3. 28.·🎨 프론트엔드 공부/JS & TS

이펙티브 타입스크립트 (댄 밴더캄 지음) 를 읽고 정리

📍요약

✅암시적 any와 any[] 타입은 진화할 수 있다

- 명시적 any : 진화 없이 계속 any

- any 타입의 진화 : 중간에 값이 할당되거나, 배열에 원소가 추가되면 타입이 변경되는 것

 

✅any 진화는 타입 안정성에 좋지는 않다

- 중간에 실수로 타입이 오염될 수 있음

- 명시적 타입 구문이 바람직하다

 

📍변수의 타입이 any인 경우, 다른 타입으로 확장될 수 있다

일반적으로 변수의 타입이 선언 시에 결정된다. 그리고 한번 정해지면 새로운 값이 추가되지 않는다

- 그러나 any의 경우, 예외가 존재한다

 

예시) 일정 범위의 숫자를 배열에 담아 리턴하는 함수

- out 의 타입이 변경된다 (any -> number[])

function range(start: number, limit: number) {
  const out = [];  // Type is any[]
  for (let i = start; i < limit; i++) {
    out.push(i);  // Type of out is any[]
    // any 타입의 진화는 값을 할당하거나, 배열에 요소를 넣은 후에만 발생하므로
    // 아직은 계속 any[]
  }
  return out;  // Type is number[]
}

 

✅조건문에서는 분기에 따라 타입이 변화한다

let val;  // Type is any
if (Math.random() < 0.5) {
  val = /hello/;
  val  // Type is RegExp
} else {
  val = 12;
  val  // Type is number
}
val  // Type is number | RegExp

 

✅변수 선언 시에 null 을 할당해도 일단 any가 배정된다.

- 또한 try/catch 문의 경우에도 조건문처럼 any 진화가 발생한다

function somethingDangerous() {}
let val = null;  // Type is any
try {
  somethingDangerous();
  val = 12;
  val  // Type is number
} catch (e) {
  console.warn('alas!');
}
val  // Type is number | null

 

✅any 타입의 진화는 noImplicitAny=true 일 때만 발생하며, 명시적으로 any를 설정하면 타입이 그대로 유지된다

let val: any;  // Type is any
if (Math.random() < 0.5) {
  val = /hello/;
  val  // Type is any
} else {
  val = 12;
  val  // Type is any
}
val  // Type is any

 

✅암시적 any (implicitly any) 상태인 변수를 할당 전에 곧장 사용하려고 하면, Implicitly Any 에러 발생

- 함수를 호출해도 Implicitly Any 에러 발생

- 암시적 any 상태일 때는 바로 사용할 수 없다

function range(start: number, limit: number) {
  const out = [];
  //    ~~~ Variable 'out' implicitly has type 'any[]' in some
  //        locations where its type cannot be determined
  if (start === limit) {
    return out;
    //     ~~~ Variable 'out' implicitly has an 'any[]' type
  }
  for (let i = start; i < limit; i++) {
    out.push(i); // 아직 any[]
  }
  return out;
}

 

 

'🎨 프론트엔드 공부/JS & TS' 카테고리의 다른 글
  • JavaScript 실행시간 측정 : performance.now()
  • #42 모르는 타입의 값에는 any 대신 unknown을 사용하기
  • #40 함수 안으로 타입 단언문 감추기
  • #39 any를 구체적으로 변형해서 사용하기
지식물원
지식물원
지식이 자라는 식물원!
  • 지식물원
    지식물원
    지식물원
  • 전체
    오늘
    어제
    • 분류 전체보기 (510)
      • 🎨 프론트엔드 공부 (247)
        • JS & TS (86)
        • HTML & CSS (22)
        • React & Next (49)
        • Vue & Nuxt (22)
        • 기타 (68)
      • 🤓 기술 학습 & 공부 기록 (116)
        • Node.js (0)
        • Python (37)
        • 백엔드 (0)
        • 딥러닝 (1)
        • 컴퓨터 일반 (72)
        • 개발 인프라 (6)
      • 👨‍💻 프로젝트 경험 (6)
        • Work (0)
        • Toy (6)
      • ⚙️ 개발 팁 & 노하우 (21)
        • 프론트엔드 (6)
        • 기타 (15)
      • ☕️ 커리어 & 인터뷰 준비 (88)
        • 코딩 테스트 (88)
      • 📰 기술 트렌드 & 생각 정리 (4)
      • 📚 기타 (25)
        • 마케팅 (15)
        • 비개발서적 (10)
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

    • 모바일 접속 시 코드 하이라이팅 깨질 때
  • 인기 글

  • hELLO· Designed By정상우.v4.10.3
지식물원
#41 any의 진화를 이해하기
상단으로

티스토리툴바