May 19, 2021
const size: number = 200;
const isBig: boolean = size > 100;
const msg: string = isBig ? 'big' : 'small';
const ages: number[] = [21, 22, 23];
const ages2: Array<number> = [21, 22, 23];
ages.push('a'); // 컴파일 에러
const person: [string, number] = ['jessie', 21];
person[0].substr(1);
person[1].substr(1); // 컴파일 에러
console.log(typeof 123); // number
console.log(typeof 'jessie'); // string
console.log(typeof [1, 2, 3]); // object
number
: 숫자boolean
: 불리언string
: 문자열number[]
: 숫자로 이루어진 배열Array<number>
: 숫자로 이루어진 배열ages
변수는 숫자로 이루어진 배열 타입이기 때문에 문자열을 push하면 컴파일 에러가 발생한다.[string, number]
와 같은 형태로 tuple
타입을 정의할 수 있다. 배열처럼 생기긴 했지만, 각 인덱스별로 타입을 미리 정의해놓을 수 있는 타입이다. 여기에서는 첫 번째 인덱스에는 string
타입, 두 번째 인덱스에는 number
타입만 입력할 수 있다.string
에는 substr
이라는 메서드가 존재하지만 number
에는 substr
라는 메서드가 없기 때문에 컴파일 에러가 발생한다.typeof [1, 2, 3]
는 object
이다. 자바스크립트에서는 array
라는 타입은 없고 모두 object
로 인식이 된다. 따라서 타입스크립트를 사용하면 array라는 타입을 관리할 수도 있고 array 안의 원소의 타입도 정의할 수 있고 tuple 같은 것도 정의할 수 있다. ⇒ 기존 자바스크립트보다 훨씬 풍부하게 타입을 정의할 수 있다.let v1: undefined = undefined;
let v2: null = null;
v1 = 123; // 컴파일 에러
let v3: number | undefined = undefined;
v3 = 123;
console.log(typeof undefined); // undefined
console.log(typeof null); // object
undefined
와 null
도 각각 타입으로 정의할 수 있다.v1
은 undefined
만 가능한 타입이기 때문에 number
타입으로 값을 할당하려고 해서 컴파일 에러가 발생한다.v3
은 number
와 undefined
두 가지 타입이 가능하기 때문에 number
타입으로 값을 할당할 수 있다. number | undefined
에서 |
기호는 유니온 타입을 나타낸다.let v1: 10 | 20 | 30;
v1 = 10;
v1 = 15; // 컴파일 에러
let v2: 'jessie' | 'lia';
v2 = 'jin'; // 컴파일 에러
v1
은 10
또는 20
또는 30
을 가질 수 있는 타입이다. 따라서 15
를 할당하려고 하면 컴파일 에러가 발생한다.v2
는 jessie
또는 lia
를 가질 수 있는 타입이다. 따라서 jin
을 할당하려고 하면 컴파일 에러가 발생한다.let value: any;
value = 123; // OK
value = 'jessie'; // OK
value = () => {}; // OK
function f1(): void {
console.log('hello world');
}
function f2(): never {
throw new Error('some error');
}
function f3(): never {
while (true) {
// ...
}
}
function f4(): string {
return 'jessie';
}
function f5(): number {
return 100;
}
void
와 never
를 사용할 수 있다.void
: 아무 값도 반환하지 않고 종료되는 함수의 반환 타입never
: 항상 예외가 발생해서 비정상적으로 종료되거나 무한루프 때문에 종료되지 않는 함수의 반환 타입 (보통 never
타입은 사용하는 경우가 거의 없다.)string
, 함수가 숫자를 반환한다면 함수의 반환 타입은 number
.)function getText(name: string, age: number, language?: string): string {
const nameText = name.substr(0, 10);
const ageText = age >= 35 ? 'senior' : 'junior';
const languageText = language ? language.substr(0, 10) : '';
return `name: ${nameText}, age: ${ageText}, language: ${languageText}`;
}
getText('jessie', 23, 'ko'); // OK
getText('jessie', 23); // OK - language는 undefined가 된다.
getText('jessie', 23, 123); // 123 부분에서 컴파일 에러
language
는 문자열일 수도 있고 undefined
일 수도 있다.function getText(name: string, language?: string, age: number)
와 같이 선택 매개변수를 중간에 입력하면
함수를 호출할 때 입력하는 두 번째 인자가 language
를 가리키는지 age
를 가리키는지 알 수 없기 때문이다.function getText(name: string, age: number = 15, language = 'korean'): string {
return `name: ${name}, age: ${age}, language: ${language}`;
}
getText('jessie'); // name: jessie, age: 15, language: korean
getText('jessie', 23); // name: jessie, age: 23, language: korean
getText('jessie', 30, 'english'); // name: jessie, age: 30, language: english
age
에는 기본값으로 15
를 입력하고 있고 language
에는 기본값으로 korean
을 입력하고 있다.age
는 명시적으로 number 타입을 지정해줬지만 language
는 타입을 따로 지정하지 않았다. 사실 기본값으로 문자열을 할당해줬기 때문에 language
의 타입은 자동으로 string이 된다.function getText(name: string, ...rest: number[]): string {
return `name: ${name}, rest: ${rest}`;
}
getText('jessie', 1, 2, 3);
getText('jessie', 1, '2', 3); // 컴파일 에러
rest
매개변수에 담는다.rest
를 number[]
타입으로 정의했기 때문에 중간에 다른 타입이 들어가면 컴파일 에러가 발생한다.let myInfo: object;
myInfo = { name: 'jessie' };
console.log(myInfo.name); // 컴파일 에러: Property 'name' does not exist on type 'object
object
로 표현할 수 있다.myInfo.name
출력 부분에서는 왜 에러가 날까? myInfo
안에 name
이 있는데? ⇒ object
타입 안에는 name
이라는 속성이 없기 때문이다.interface
를 사용해야 한다.let v1: (1 | 3 | 5) & (3 | 5 | 7);
v1 = 3;
v1 = 1; // 컴파일 에러
|
: Union 타입 ⇒ 합집합&
: Intersection 타입 ⇒ 교집합v1
은 3
과 5
만 가질 수 있는 타입이다. 따라서 1
을 할당하면 컴파일 에러가 발생한다.type W = number | string;
let width: W;
width = 100;
width = '100px';
type
키워드를 이용해서 타입에 별칭을 줄 수 있다.