반응형
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 |
Tags
- 국비코딩
- react
- ReactNative
- spring
- 리액트
- 자바스크립트
- 리액트네이티브
- 정보처리기사실기
- 정보처리기사요약
- typescript
- javascript
- 스프링
- 평일코딩
- 오라클
- 자바스크립트 코딩테스트
- 정보처리기사실기정리
- Oracle
- 자스코테
- 코딩테스트
- VUE
- 정보처리기사실기요약
- 정보처리기사정리
- 자바의정석
- 이안의평일코딩
- 정보처리기사
- Java의정석
- 타입스크립트
- php
- 국비IT
- CSS
Archives
- Today
- Total
이안의 평일코딩
[TypeScript] 타입 추론, 단언, 가드, 호환, 모듈화 본문
반응형
타입 추론
// 타입 추론 기본 1 (변수, 속성, 인자의 기본 값, 함수의 반환 값)
var a = 'abc';
function getB(b = 10) {
var c = 'hi';
return b + c;
}
10 + '10' //1010
// 타입 추론 기본 2 (인터페이스, 제네릭 이용)
interface Dropdown<T> {
value: T;
title: string;
}
var shoppingItem: Dropdown<string> = {
value: 'abc',
title: 'hello'
}
// 타입 추론 기본 3 (복잡한 구조)
interface Dropdown<T> {
value: T;
title: string;
}
interface DetailedDropdown<K> extends Dropdown<K>{
description: string;
tag: K;
}
var detailedItem: DetailedDropdown<string> = {
title: 'hello',
description: 'ab',
value: 'a',
tag: 'a'
}
// Best Common Type (가장 근접한 타입 추론)
var arr = [1, 2, true, true, 'a'];
타입 단언
내가 정하는 타입으로 간주.
// 타입 단언(type assertion)
var a;
a = 20;
a = 'a'
var b = a as string; // b가 any에서 string으로 변함
타입스크립트보다 개발자 자신이 타입에 대해 더 잘 알고 있으니 내가 건들겠다.
// DOM API 조작
<div id="app">hi</div>
var div = document.querySelector('#app') as HTMLDivElement;
//if (div) {
div.innerText
//}
타입 가드
interface Developer {
name: string;
skill: string;
}
interface Person {
name: string;
age: number;
}
function introduce(): Developer | Person {
return { name: 'ian', age: 28, skill: 'TypeScript' }
}
var ian = introduce();
console.log(tony.skill); // 오류: Union Type은 공통된 속성 name만 접근 가능
if ((ian as Developer).skill) {
var skill = (ian as Developer).skill;
console.log(skill);
} else if ((ian as Person).age) {
var skill = (ian as Person).age;
console.log(age);
}
타입 가드를 이용해보자!
// 타입 가드 정의
function isDeveloper(target: Developer | Person): target is Developer {
return (target as Developer).skill !== undefined; // 존재할 때
}
if (isDeveloper(ian)) {
console.log(ian.skill);
} else {
console.log(ian.age);
}
타입 호환
특정 타입이 다른 타입에 잘 맞는지를 의미.
// 인터페이스
interface Developer {
name: string;
skill: string;
}
interface Person {
name: string;
}
var developer: Developer;
var Person: Person;
// developer = person; 오류: 왼쪽 객체가 더 크기때문에 호환이 안됨
person = developer;
클래스도 마찬가지로 오른쪽보다 왼쪽이 더크면 오류가 발생.
// 인터페이스
interface Developer {
name: string;
skill: string;
}
// 클래스
class Person {
name: string;
}
var developer: Developer;
var person: Person;
// developer = new Person(); 구조적 타이핑: 내부적 속성으로 비교
함수와 제네릭도 구조적으로 타입이 큰 범위와 작은 것과 호환되지 않는다.
// 함수
var add = function(a: number) {
}
var sum = function(a: number, b: number) {
}
// sum의 구조가 add보다 더 크다.
sum = add; // 호환 가능
// add = sum; 오류: 호환 불가
// 제네릭
interface Empty<T> {
}
var empty1: Empty<string>;
var empty2: Empty<number>;
empty1 = empty2;
empty2 = empty1;
interface NotEmpty<T> {
data: T; // <string>, <number> 구조적 타입의 차이가 생김
}
var notempty1: NotEmpty<string>;
var notempty2: NotEmpty<number>;
//notempty1 = notempty2; 서로 호환되지 않음
//notempty2 = notempty1; 서로 호환되지 않음
타입 모듈화
types.ts
export interface Todo {
title: string;
checked: boolean;
}
app.ts
import { Todo } from './types'
var item: Todo = {
title: '할 일 1',
checked: false,
}
반응형
'Front-end > TypeScript' 카테고리의 다른 글
[TypeScript] 유틸리티 타입, 맵드 타입 (0) | 2021.06.01 |
---|---|
[TypeScript] 타입스크립트 리액트 프로젝트 Setting (0) | 2021.03.04 |
[TypeScript] 타입스크립트 기초 (5) - 제네릭 (0) | 2021.01.21 |
[TypeScript] 타입스크립트 기초 (4) - 이넘, 클래스 (2) | 2021.01.20 |
[TypeScript] 타입스크립트 기초 (3) - 유니온 타입과 인터섹션 타입 (0) | 2021.01.20 |
Comments