
tuple, Enum, Any, Never, Void, Union
자바스크립트에서 사용하는 원시형, 참조형 타입은 물론이고, 타입 스크립트에서 추가로 제공하는 타입도 있다.
사용자로부터 받은 데이터, 서드 파티 라이브러리에서 가져온 데이터 등 잘 알지 못하는 타입을 표현할 수 있다.
any 타입을 부여하면 컴파일 검사할 때 타입 검사를 하지 않고 통과 시킨다. = 일반 자바스크립트 같은 기능
그러면 타입스크립트를 쓰는 이유가 없기 때문에 any 타입은 최대한 쓰지 않는게 좋다.
변수 또는 함수의 매개변수에 대해 둘 이상의 데이터 타입을 사용할 수 있다.
let code: (string | number);
code = 123; //OK
code = 'hello'; //OK
code = false; //Compile Error
let ID: string | number;
ID = 111; //OK
ID = 'E111'; //OK
ID = true; //Compile Error
배열을 보다 특수한 형태로 사용할 수 있게 해주는 타입
tuple에 명시적으로 지정한 형식에 따라 아이템의 순서를 정해야 한다.
추가되는 아이템 또한 tuple에 명시된 타입만 사용 가능하다.
var employee: [number, string] = [1, 'Steve'];
var person: [number, string, boolean] = [1, 'Steve', true];
var user: [number, string, boolean, number, string] //변수 선언
user = [1, 'Steve', true, 20, 'Admin'] //변수 초기화
배열의 아이템으로 배열이 들어가는 다차원 배열 형태에서 아이템의 타입을 지정해줄 수 있다.
var employee: [number, string][];
employee = [[1, 'Bill'], [2, 'Steve'], [3, 'Jeff']];
튜플 타입의 배열에 요소를 추가할 때는 명시한 타입에 맞춰 추가해야한다.
var employee: [number, string] = [1, 'Bill'];
employee.push(2, 'Steve');
console.log(employee) //[1, 'Bill', 2, 'Steve']
명시한 타입과 다른 타입의 데이터를 추가하려고 시도하면 에러가 발생한다.
employee.push(true); //ERROR
enumerated type(열거형)
값들의 집합을 명시하고 이를 사용하는 타입
enum PrintMedia {
Newspaper, //0
Newsletter, //1
Magazine, //2
Book //3
}
열거된 PrintMedia의 각 아이템은 별도의 값이 설정되지 않은 경우 0부터 시작한다. (인덱스 느낌...?)
각 아이템에 값을 할당할 수 있다.
값이 할당되지 않은 아이템은 이전 아이템의 값에 +1된 값이 설정된다.
enum PrintMedia {
Newspaper = 1, //1
Newsletter = 50, //50
Magazine = 55, //55
Book //55 + 1 => 56
}
그러면 이 데이터 타입을 어떤 식으로 사용할 수 있나?
let mediaType: number = PrintMedia.Book //56
let type: string = PrintMedia[1] //Newspaper
enum과 객체는 비슷하게 생겼다. 그리고 그 기능도 비슷해 보인다.
실제로 enum은 그 자체로 객체이기도 하다. 하지만,
enum을 사용해서 언어 코드를 정의하는 집합을 만들 수 있다.
enum LanguageCode {
korean = 'ko',
english = 'en',
japanese = 'ja',
chinese = 'zh',
spanish = 'es',
}
const code: LanguageCode = LanguageCode.english
데이터가 없는 경우 void를 사용한다.
예를 들어, 함수가 값을 반환하지 않으면 (=리턴값이 없으면) 반환 유형으로 void를 지정할 수 있다.
타입이 없는 상태이며, any와 반대의 의미이다.
function sayHi(): void {
console.log('Hi')
}
let speech: void = sayHi();
console.log(speech) //undefined
리턴값의 타입을 적어주면 된다.
function sayHi(): string {
console.log('Hi')
return 'Hello'
}
절대 발생하지 않을 값을 나타내는 타입
일반적으로 함수의 리턴 타입으로 사용.
항상 오류를 리턴하거나 리턴값을 절대로 내보내지 않을 것(=리턴값이 없는 무한 루프)을 확신할 때 사용한다.
//항상 오류 리턴
function throwError(errorMsg: string): never {
throw new Error(errorMsg);
}
//무조건 리턴값이 없을 때
function keepProcessing(): never {
while (true) {
console.log('I always does something and never ends.')
}
}
void 타입은 undefined나 null 값을 가질 수 있다.
never 타입은 어떠한 값도 가질 수 없다. (undefined, null도 불가)
function sayHi(): void {
console.log('Hi')
}
let speech: void = sayHi();
console.log(speech) //undefined
위 예제에서 speech: never 를 설정하면 컴파일 오류 발생
일단, sayHi() 함수는 리턴값이 없고 리턴값의 데이터타입을 void로 설정해놓은 상태이다. 이때, 함수를 실행하면 실제로 반환하는 데이터의 값이 undefined이기 때문에 값을 가진다고 볼 수 있다.
따라서 이 함수를 실행한 결과(=반환값의 데이터 타입)을 speech 라는 변수에 할당한다고 했을 때 이 데이터의 타입(=sayHi() 함수의 리턴값의 타입)은 never가 될 수 없다!!!
//Boolean
let boolean: boolean;
let falseBoolean: boolean = false;
let number: number;
let integer: number = 6;
let float: number = 1.2345;
let string: string;
let firstName: string = 'Doe';
let lastName: string = 'John';
//한가지 타입만 가지는 배열
let names1: string[] = ['John', 'Kim'];
let names2: Array<string> = ['John', 'Kim'];
//여러 타입을 가지는 배열
let array1: (string | number)[] = ['John', 1, 2];
let array2: Array<string | number> = ['John', 1, 2];
//읽기 전용 배열 생성
let stringArray: readonly string[] = ['A', 'B'];
let numberArray: ReadonlyArray<number> = [1, 2];
배열과 비슷하지만 해당 자리에 정해진 타입, 고정된 길이를 지켜야 한다.
let tuple1: [string, number];
tuple1 = ['a', 1];
tuple1 = ['a', 1, 2]; //ERROR
tuple1 = [1, 'a']; //ERROR
//튜플 타입의 배열(2차원 배열)
let users: [number, string][];
// users.push(2); //ERROR
users = [[1, 'John'], [2, 'Doe']];
//push() 등을 통해 값을 넣는 것은 가능
let tuple2: [string, number];
tuple2 = ['a', 1];
tuple2.push(2);
console.log(tuple2) //['a', 1, 2]
모든 타입으로 어떠한 값도 할당 가능, 되도록 사용 X
서드파티 라이브러리 사용 시 타입 모를 때만 사용
let any: any = 'abc';
any = 1;
any = [];
알 수 없는 타입을 의미, 어떠한 값도 할당 가능
any 타입을 다른 타입에 할당하는 것은 가능하지만,
unknown을 다른 타입에 할당하는 것은 불가능
let unknown: unknown = 123;
let string1: string = unknown //ERROR, unknown을 다른 타입에 할당 불가능
'as' 키워드를 통해 타입스크립트가 추론하지 못하는 타입을 개발자가 직접 명시해주는 문법
let string2: string = unknown as string //타입 단언을 통해 억지로 넣어줄 순 있음
typeof 연산자를 사용해서 타입을 확인했을 때 object를 반환하는 데이터들에 할당 (객체, 배열, null... 등)
let obj: object = {};
let arr: object = [];
let date: object = new Date();
let obj: object = {
id : 1,
name : 'John'
}
//위 방법보다 아래 방법으로 타입을 작성해주는 것이 좋다.
let obj: {id: number, name: string} = {
id : 1,
name : 'John'
}
2개 이상의 타입을 허용
let union: (string | number);
union = 'hi';
union = 123;
union = []; //ERROR
let func1: (arg1: number, arg2: number) => number;
func1 = function (x, y) {
return x * y;
}
let func2: () => void;
func2 = function () {
console.log('hi');
}