Programming/TypeScript

추론 가능한 타입을 사용하기

2023. 2. 28. 15:08
목차
  1. 이상적인 코드 작성법
  2. 타입 명시가 좋은 경우 (객체)
  3. 타입 명시가 좋은 경우 (함수)

Type Script의 Type Checker는 타입 추론이라는 기능을 가지고 있어서, 사용자가 직접 타입을 입력하지 않아도 알아서 타입을 체크한다.

 

// 이렇게 쓰지 말자
let letNum1: number = 11;
const constNum1: number = 33;

// 직접 타입 작성을 하지 않아도, 알아서 추론해준다.
let letNum2 = 11;	// number type
const constNum2 = 33;	// Union type(33)

 

심지어 복잡한 객체 구조까지 추론이 가능하다.

// 아래 두 코드는 동일하게 타입이 추론된다.

// 너무 안타깝다
const person1: {
	name: string;
	born: {
		when: Date;
		where: string;
	},
	age: number;
} = {
	name: 'Conative',
	born: {
		when: new Date('1997-05-13'),
		where: 'Pyoung Taek'
	},
	age: 25
}


// 편안
const person2 = {
	name: 'Conative',
	born: {
		when: new Date('1997-05-13'),
		where: 'Pyoung Taek'
	},
	age: 25
}

 

이상적인 코드 작성법

'Effective Typescript' 책에서는 아래와 같이 말하고 있다.

함수 / 매서드 시그니처에 타입 구문을 포함하지만,
함수 내에서 생성된 지역 변수에는 타입 구문을 넣지 않는것.
이것이 이상적인 코드다.
interface Person {
	name: string,
	age: number
}

// 반환 값이 무엇인지 추론하게끔 하기.
const myFunc = (user: Person) => {
	return user.name;	// string 타입으로 추론된다.
}

 

타입 명시가 좋은 경우 (객체)

근데 예외로, 타입 명시가 좋은 경우도 있다.

interface Person {
	name: string,
	age: number
}

const setPerson(user: Person) {
	const {id, age} = user;
    ...
}

// name에 string 타입 대신 number을 넣어보았다.
const user1 = {
	name: 11,
	age: 25
}

setPerson(user1);	// Error, 함수 선언부에서 문제 발생하여 무슨 문젠지 한번에 알기 힘듬


//
const user2: Person = {
	name: 33,		// Error, 선언 당시 에러 발생하여 보기 쉬움
	age: 27
}

 

타입 명시가 좋은 경우 (함수)

함수에서도 마찬가지다. 반환값을 지정해놓고, 예기치 못한 상황을 막아준다.

// is_load가 true면 fetch하고 싶을 때

// 이 경우, getServerData.then 등 promise 함수를 호출할 시 에러가 난다. (함수 내에선 에러없음)
const getServerData1 = (is_load: boolean) => {
	if(!is_load){
		return 'is_load 값이 False입니다.';
	}
    return fetch('/my/server');
}


// 아래와 같이 반환값 설정 시 에러가 제대로 뜬다.
const getServerData2 = (is_load: boolean): Promise<Response> => {
	if(!is_load){
		return 'is_load 값이 False입니다.';	// Error 발생!
	}
    return fetch('/my/server');
}

 

그리고, 반환 값을 명시해주면 타입 체커가 이상하게 추론한 것을 명확하게 적용할 수 있다.

interface Location {
	x: number,
	y: number
}

// getLocation1의 반환 타입은 {x:number, y:number} 으로 추론된다.
const getLocation1 = (loc1: Location, loc2: Location) {
	return {
		x: loc1.x + loc2;x,
        y: loc1.y + loc2.y
	}
}

// 반면, 반환값을 명확하게 작성하면 Location 타입으로 추론된다.
const getLocation1 = (loc1: Location, loc2: Location): Location {
	return {
		x: loc1.x + loc2;x,
        y: loc1.y + loc2.y
	}
}
저작자표시 (새창열림)
  1. 이상적인 코드 작성법
  2. 타입 명시가 좋은 경우 (객체)
  3. 타입 명시가 좋은 경우 (함수)
'Programming/TypeScript' 카테고리의 다른 글
  • 타입 선언과 타입 단언
Conative
Conative
잘못된 내용이나 부족한 부분 지적 감사히 받겠습니다.
Conative
긍정적인 개발자
Conative
전체
오늘
어제
  • 분류 전체보기 (38)
    • Programming (25)
      • 오답노트 (2)
      • JavaScript (2)
      • TypeScript (2)
      • React (6)
      • Redux (3)
      • PHP (8)
    • System (4)
      • Jenkins (1)
      • Webpack (2)
      • Docker (1)
    • ETC (2)
      • ElasticSearch (2)
    • 계륵 (6)
      • 뭔가 쓰려했는데 잊혀짐 (2)
      • 오래된 대학 책 + 독후감 등 (4)
    • Common (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

최근 글

hELLO · Designed By 정상우.
Conative
추론 가능한 타입을 사용하기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.