티스토리 뷰

개발공부/🟦 TypeScript

[TS] 타입스크립트의 기본 Type

2022. 10. 9. 20:02
 

JavaScript With Syntax For Types.

TypeScript extends JavaScript by adding types to the language. TypeScript speeds up your development experience by catching errors and providing fixes before you even run your code.

www.typescriptlang.org

 

1️⃣  타입스크립트의 기본 Type

 

-  JavaScript 코드에 변수나 함수 등 Type을 정의

-  Type을 나타내기 위해서 타입 표기(Type Annotation)를 사용

 

 

기본 자료형 (primitive type)

:  object 와 reference 형태가 아닌 실제 값을 저장하는 자료형

 

일반적으로 Java와 같은 다른 언어에서는 기본 자료형은 시스템 자원이 많이 소모된다는 단점이 있어서 내장함수를 제공하지 않는다. 반면, 자바스크립트는 처리 방식이 달라서 primitive type에서  내장함수를 제공하여 사용이 가능하다.

 

string   문자열을 저장하는 타입
boolean   참/거짓을 저장하는 타입
number 부동 소수 값을 저장하는 타입
2진수, 8진수, 10진수, 16진수 사용 가능
null 값이 의도적으로 비어 있는 상태를 저장하는 타입
undefined 아무 값이 할당되지 않은 상태를 저장하는 타입
symbol (ES6 추가)  

 

let str: string = "hi";

let isSucceeded: boolean = true;

let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;

let n: null = null;

let u: undefined = undefined;

 

💡 참고

null과 undefined는 비슷한 것 같지만 다른 값이다.

typeof null    // 'object'
typeof undefined    // 'undefined'

null === undefined // false
null == undefined // true
null === null // true
null == null // true
!null // true
isNaN(1 + null) // false
isNaN(1 + undefined) // true

 

 

 

 

참조 자료형 (reference type)

:  객체, 배열, 함수 등과 같은 Object형식의 타입

 

메모리에 값을 주소로 저장하고, 출력 시 메모리 주소와 일치하는 값을 출력한다.

 

object 기본 자료형에 해당하지 않는 타입
string, boolean, number, null, undefined를 제외한 타입
array 배열을 저장하는 타입
function
함수를 저장하는 타입
function create(o: object): void{}

create({ prop: 0 }) // 성공
create([1, 2, 3]) // 성공
create("string") // error
create(false) // error
create(42) // error
create(null) // error
create(undefined) // error


let arr: number[] = [1, 2, 3]

// 제네릭을 사용한 타입 표기 가능
let arr: Array<number> = [1, 2, 3]

 

 

 

추가 제공 자료형

:  TypeScript에서 개발자의 편의를 위해 추가로 제공하는 타입

 

tuple 길이와 각 요소의 타입이 정해진 배열을 저장하는 타입
enum  -  특정 값(상수)들의 집합을 저장하는 타입
-  코드가 단순해지며 가독성이 좋고, 인스턴스 생성과 상속을 방지하여 상수값의 타입안정성이 보장된다.
any  -  모든 타입을 저장 가능
-  컴파일 중 타입 검사를 하지 않는다
void  -  보통 함수에서 반환 값이 없을 때 사용
-  any의 반대 타입
-  일반적으로 변수에는 undefined와 null만 할당하고, 함수의 반환 값이 없을 때는 void를 사용
never -  발생할 수 없는 타입
-  항상 오류를 발생시키거나 절대 반환하지 않는 반환 타입
-  종료되지 않는 함수
let arr: [string, number] = ["Hi", 6];

arr[1].concat("!");    // Error, 'number' does not have 'concat’

// 정의하지 않은 index 호출 시 오류 
arr[3] = "hello";    // Error, Property '3' does not exist on type '[string, number]'
enum Car { BUS, TAXI, SUV };

let bus: Car = Car.BUS;
let bus: Car = Car[0];    // 인덱스 번호로 접근

enum Car { BUS = 1, TAXI = 2, SUV = 3 };    // 인덱스를 사용자 편의로 변경
let taxi: String = Car[2];

enum Car { BUS = 2, TAXI, SUV };
let taxi: String = Car[3];
let str: any = "hi";
let num: any = 10;
let arr: any = ["a", 2, true];
let unknown: void = undefined;

function sayHi(): void {
    console.log("hi");
}
// 종료되지 않는 함수
function neverEnd(): never {
    while (true) {}
}

// 함수가 종료되어서 never타입이 아니라 오류 발생
// Error: A function returning 'never' cannot have a reachable end point.ts(2534)
function neverEnd(): never {
    while (true) {
        break;
    }
}

// 항상 오류를 발생시키는 함수
function error(message: string): never {
    throw new Error(message);
}

 

 

 

 

 

2️⃣  Utility types

 

-  TypeScript는 공통 타입 변환을 용이하게 하기 위해 유틸리티 타입을 제공한다.

-  유틸리티 타입은 전역으로 사용 가능하다.

-  타입스크립트가 버전 업되면서 지속적으로 uility type이 추가되고 있다.

 

 

 

Partial<T>

-  프로퍼티를 선택적으로 만드는 타입을 구성.

-  주어진 타입의 모든 하위 타입 집합을 나타내는 타입을 반환.

interface Todo {
    title: string;
    description: string;
}

function updateTodo(todo: Todo, fieldsToUpdate: Partial<Todo>) {
    return { ...todo, ...fieldsToUpdate };
}

const todo1 = {
    title: 'organize desk',
    description: 'clear clutter',
};

const todo2 = updateTodo(todo1, {
    description: 'throw out trash',
});

 

 

 

Readonly<T>

-  프로퍼티를 읽기 전용(readonly)으로 설정한 타입 을 구성.

interface Todo {
    title: string;
}

const todo: Readonly<Todo> = {
    title: 'Delete inactive users',
};

// 사용 예: frozen 객체의 프로퍼티에 재할당 방지
todo.title = 'Hello';    // Error: Cannot as sign to 'title' because it is a read-only property

 

 

 

Record<T>

-  프로퍼티의 집합 K로 타입을 구성.

-  타입의 프로퍼티들을 다른 타입에 매핑시키는데 사용.

interface PageInfo {
    title: string;
}

type Page = 'home' | 'about' | 'contact';

const x: Record<Page, PageInfo> = {
    about: { title: 'about' },
    contact: { title: 'contact' },
    home: { subTitile: 'home' },    // Error: '{ subTitile: string; }' is not assignable
    main: { title: 'home' },        // Error: main is not assignable to type 'Page'.
};

 

 

 

Pick<T, K>

-  프로퍼티 K의 집합을 선택해 타입을 구성.

interface Todo {
    title: string;
    description: string;
    completed: boolean;
}

type TodoPreview = Pick<Todo, 'title' | 'completed'>;

const todo: TodoPreview = {
    title: 'Clean room',
    completed: false,
    description: 'description'    // Error: 'description' is not assignable to type
};

 

 

 

Omit<T, K>

-  모든 프로퍼티를 선택한 다음 K를 제거한 타입을 구성.

interface Todo {
    title: string;
    description: string;
    completed: boolean;
}

type TodoPreview = Omit<Todo, 'description'>;

const todo: TodoPreview = {
    title: 'Clean room',
    completed: false,
    description: 'description'    // Error: 'description' is not assignable to type
};

 

 

 

Exclude<T, U>

-  T에서 U에 할당할 수 있는 모든 속성을 제외 한 타입을 구성.

type T0 = Exclude<"a" | "b" | "c", "a">;          // "b" | "c"
type T1 = Exclude<"a" | "b" | "c", "a" | "b">;    // "c"
type T2 = Exclude<string | number | (() => void), Function>;     // string | number

 

 

 

Extract<T, U>

-  T에서 U에 할당 할 수 있는 모든 속성을 추출 하여 타입을 구성.

type T0 = Extract<"a" | "b" | "c", "a" | "f">;    // "a"
type T1 = Extract<string | number | (() => void), Function>;    // () => void

 

 

 

NonNullable<T>

-  null 과 undefined를 제외한 타입.

type T0 = NonNullable<string | number | undefined>;    // string | number
type T1 = NonNullable<string[] | null | undefined>;    // string[]

 

 

 

Parameters<T>

-  함수 타입 T의 매개변수 타입들의 튜플 타입을 구성.

declare function f1(arg: { a: number, b: string}): void
type T0 = Parameters<() => string>;           // []
type T1 = Parameters<(s: string) => void>;    // [string]
type T2 = Parameters<(<T>(arg: T) => T)>;     // [unknown]
type T4 = Parameters<typeof f1>;              // [{ a: number, b: string }]
type T5 = Parameters<any>;                    // unknown[]
type T6 = Parameters<never>;                  // never
type T7 = Parameters<string>;                 // 오류
type T8 = Parameters<Function>;               // 오류

 

 

 

ConstructorParameters<T>

-  생성자 함수 타입의 모든 매개변수 타입을 추출.

-  모든 매개변수 타입을 가지는 튜플 타입(T가 함수가 아닌 경우 never)을 생성.

type T10 = ConstructorParameters<ErrorConstructor>;     // [(string | undefined)?]
type T1 = ConstructorParameters<FunctionConstructor>;   // string[]
type T2 = ConstructorParameters<RegExpConstructor>;     // [string, (string | undefined)?]

interface I1 {
    new(args: string): Function;
}

type T12 = ConstructorParameters<I1>;    // [string]

function f1(a: T12) {
    a[0]
    a[1]    // Error: Tuple type '[args: string]' of length '1' has no element at index '1'.
}

 

 

 

ReturnType<T>

-  함수 T의 반환 타입으로 구성된 타입을 생성.

declare function f1(): { a: number, b: string }
type T0 = ReturnType<() => string>;          // string
type T1 = ReturnType<(s: string) => void>;   // void
type T2 = ReturnType<(<T>() => T)>;          // {}
type T3 = ReturnType<(<T extends U, U extends number[]>() => T)>;    // number[]
type T4 = ReturnType<typeof f1>;    // { a: number,b: string }
type T5 = ReturnType<any>;          // any
type T6 = ReturnType<never>;        // any
type T7 = ReturnType<string>;       // 오류
type T8 = ReturnType<Function>;     // 오류

 

 

Required<T>

-  T의 모든 프로퍼티가 필수로 설정된 타입을 구성.

interface Props {
    a?: number;
    b?: string;
};

const obj: Props = { a: 5 };
const obj2: Required<Props> = { a: 5 };    // Error: Property 'b' is missing in type '{ a:number; }'

 

 

 

 

 

 


 이 글은 엘리스의 AI트랙 5기 강의를 들으며 정리한 내용입니다.

반응형

'개발공부 > 🟦 TypeScript' 카테고리의 다른 글

[TS] Generic  (0) 2022.11.08
[TS] Interface  (0) 2022.11.07
[TS] 객체 지향 프로그래밍 (OOP)  (0) 2022.10.26
[TS] TypeScript를 이용해 함수 사용하기  (0) 2022.10.09
[TS] 타입스크립트를 사용하는 이유  (0) 2022.10.09
프로필사진
개발자 삐롱히

프론트엔드 개발자 삐롱히의 개발 & 공부 기록 블로그