Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- CSS
- 레이아웃쪼개기
- vue.js
- returnType
- JS console
- 공통컴포넌트
- click and drag
- react
- utilty type
- javascript
- typescript
- React Native
- 누구나 자료구조와 알고리즘
- React.js
- TSDoc
- NonNullable
- 리액트
- 제네릭
- const 단언문
- 티스토리꾸미기
- 성능최적화
- reactjs
- 타입좁히기
- 타입스크립트
- 개발콘텐츠
- 2022
- 폰트적용하기
- Chart.js
- 반복줄이기
- 커스텀
Archives
- Today
- Total
몽땅뚝딱 개발자
[TypeScript] 타입 좁히기 본문
📍 클릭 시 이동!
◽ 1. 분기문 사용하기
예제 1. if문
const el = document.getElementById('foo') // 타입: HTMLElement | null
if(el) {
el // 타입: HTMLElement
} else {
el // 타입: null
}
예제 2. 에러 던지기
const el = document.getElementById('foo') // 타입: HTMLElement | null
if(!el) throw new Error('변수를 찾을 수 없습니다.')
el // 타입: HTMLElement
◽ 2. instanceof 사용하기
function contains(text: string, search: string|RegExp) {
if(search instanceof RegExp) {
search // 타입: RegExp
return !!search.exec(text);
}
search // 타입: string
return text.includes(search);
}
◽ 3. 속성 체크하기
interface A {
a: number
}
interface B {
b: number
}
function pockAB(ab: A | B) {
if ('a' in ab) {
ab // 타입: A
} else {
ab // 타입: B
}
ab // 타입: A | B
}
◽ 4. 명시적 '태그' 붙이기
이 패턴은 '태그된 유니온(tagged union)' 또는 '구별된 유니온(discriminated union)'이라고 불린다.
interface UploadEvent {
type: 'upload'
filename: string
}
interface DownloadEvent {
type: 'download'
}
type AppEvent = UploadEvent | DownloadEvent
function handleEvent(e: AppEvent) {
switch (e.type) {
case 'upload':
console.log(typeof e) // 타입: UploadEvent
break
case 'download':
console.log(typeof e) // 타입: DownloadEvent
break
}
}
◽ 5. '사용자 정의 타입 가드' 사용하기
타입스크립트가 타입을 식별하지 못한다면, 식별을 돕기 위해 커스텀 함수를 도입할 수도 있다.
반환 타입으로 사용된 'el is HTMLInputElement' 구문은 함수의 반환이 true인 경우 타입 체커에게 매개변수의 타입을 'HTMLInputElement'로 좁힐 수 있다고 알려준다.
이런 기법을 '사용자 정의 타입 가드'라고 한다.
function isInputElement(el: HTMLElement): el is HTMLInputElement {
return 'value' in el
}
function getElementContent(el: HTMLElement) {
if (isInputElement(el)) {
console.log(typeof el) // 타입: HTMLInputElement
return el.value
}
console.log(typeof el) // 타입: HTMLElement
return el.textContent
}
💡 주의할 점
타입 스크립트는 조건문에서 타입을 좁히는 데 능숙하지만 주의가 필요하다.
1. null은 Object이다.
const el = document.getElementById('foo') // 타입: HTMLElement | null
// 유니온 타입에서 null을 제외하기 위한 조건문 같지만, null이 object 형태이기 때문에 제외되지 않았다.
if (typeof el === 'object') {
console.log(typeof el) // 타입: HTMLElement | null
}
2. 빈 문자열과 0은 false이다.
function foo(x?: number | string | null) {
if (!x) {
// 빈 문자열('')과 0은 false가 되기 때문에 타입은 전혀 좁혀지지 않는다.
console.log(typeof x) // 타입: number | string | null | undefined
}
}
출처
댄 밴터캄, 이펙티브 타입스크립트 (프로그래밍 인사이트, 2021)
개인적으로 공부한 내용을 정리하는 블로그로
잘못된 개념을 게시하지않도록 주의하고 있으나 오류가 있을 수 있습니다.
'Development > Typescript' 카테고리의 다른 글
[TypeScript] Utility types - Partial, Record, NonNullable (0) | 2022.11.23 |
---|---|
[TypeScript] 이렇게도 사용할 수 있다! (1) (0) | 2022.11.21 |
[TypeScript] as const / const 단언문 (0) | 2022.11.20 |
[TypeScript] Utility types - Readonly, ReturnType (0) | 2022.11.19 |
[TypeScript] interface와 type의 차이 (0) | 2022.11.14 |
Comments