ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TypeScript] 기초1
    FE 2023. 7. 26. 21:43

    TypeScript

    TypeScript 사용하는 이유 : JavaScript 코드 양이 폭발적으로 늘어나고 상호작용이 증가하여 한계가 나타났음. 타입의 명시성이 부족

    ➡️ 정적타입 검사 기능을 제공, 코드 가독성과 유지 보수성 높여줌 (에러 최소화하며 코드 작성시간 단축)

    interface User {
      id: number;
      name: string;
    }
    
    function greetingUser(user: User) {
    	 console.log(`Hello, ${user.name}!`)
    }
    
    const parkUser = {
    	id: 1,
      name: "박해커"
    };
    
    greetingUser(parkUser);

    User의 정보를 쉽게 파악할 수 있고, greetingUser 함수에도 매개변수로 User 타입으로 어떤 인자를 받고 있는지 알 수 있음


    TypeScript 타입

    Boolean(불리언) 타입

    ➡️ 가장 기본적인 데이터 타입. JS와 마찬가지로 참(true), 거짓(false)으로 나타냄

     

    Number(숫자) 타입

    ➡️ JS와 마찬가지로 정수와 실수 구분 없이 Number 타입 하나로 표기 (bigint 지원)

     

    Strin(문자열) 타입

    ➡️ JS처럼 큰타옴표(")나 작은따옴표(')를 사용해서 문자열 데이터를 표현. 백틱(`)을 사용해 템플릿 리터럴을 사용하면 여러 줄에 걸쳐 문자열을 작성할 수 있음

    let firstName: string = "coding";
    let lastName: string = 'kim';
    let longString: string = `Kimcoding is a developer.
    He is 20 years old.`

     

    Array(배열) 타입

    ➡️ JS처럼 값들을 배열로 다룰 수 있게함. 두 가지 방법으로 배열 타입 선언

    1. 배열의 요소들을 나타내는 타입 뒤에 배열을 나타내는 [] 사용
    2. 제네릭 배열 타입 사용 (<> 안에 하나의 인자만 들어갈 수 있음)
    //첫 번째 방법
    let items: string[] = ["apple", "banana", "grape"];
    
    //두 번째 방법
    let numberList: Array<number> = [4, 7, 100];

     

    Tuple(튜플) 사용

    ➡️ 요소의 타입과 개수가 고정된 배열 표현

    let user: [string, number, boolean] = ["kimcoding", 20, true];
    console.log(user[2].toString());

    모든 요소가 같을 필요는 없지만 배열마다 index 타입이 정해져있음. user[2]는 boolean 타입이라 에러가 발생함

    튜플은 여러 개의 값을 가진 배열을 나타네는데 사용. (타입 에러를 방지하기 위함)

     

     

    Object(객체) 타입

    ➡️ JS와 마찬가지로 원시 타입이 아닌 타입을 나타냄. 객체 타입은 프로퍼티를 가지는 JS 값을 말하고 typeof 연산자를 사용하면 "object"를 반환하는 모든 타입을 의미 

    (JS 원시타입 : number, string, boolean, undefined, null, symbol) 

    let user: {name: string, age: number} = {
    	name: "kimcoding",
    	age: 20
    }

    객체의 프로퍼티 타입을 각기 명시해주는 것이 좋음 (key-value 구체적인 타입도 지정 가능)

     

     

    Any 타입

    ➡️ 알지 못하는 타입을 표현할 때 타입 검사를 하지 않고자 any 타입을 사용할 수 있음

    let obj: object = {};
    
    //에러가 납니다.
    obj = "hello";
    
    let maybe: any = 4;
    
    //정상적으로 동작합니다.
    maybe = true;

    any 타입을 사용하면 변수에 값을 재할당할 경우에 타입에 구애받지 않고 재할당 할 수 있음

    엄격한 검사를 하지 않아서 에러가 나지 않고 실제 할당된 값이 가지지 않는 메서드나 프로퍼티이기 때문에 반환되는 값은 undefined.

    let maybe: any = 4;
    
    //undefined로 출력됩니다.
    console.log(maybe.length);

    또는 any 타입의 일부만 알 경우 여러 타입 섞인 배열을 받고자 할 때 유용

    let list: any[] = [1, true, "free"];
    
    //any로 다루고 있기 때문에 index 1번째 요소가 boolean 타입이지만 number 타입으로 재할당할 수 있습니다. 
    list[1] = 100;

    TypeScript의 함수

    JS와 마찬가지로 기명함수와 화살표 함수 등으로 만들 수 있음

    //named function
    function add(x, y){
    	return x + y;
    }
    
    //arrow function
    let add = (x, y) => {
    	return x + y;
    }

    (JS에서의 함수 작성)

     

    //named function
    function add(x: number, y: number) {
    	return x + y;
    }
    
    //arrow function
    let add = (x: number, y: number) => {
    	return x + y;
    }

    (TypeScript에서 함수작성) 매개변수의 타입과 리턴값을 명시해야함. 매개변수 타입을 작성, 리턴값의 타입을 괄호 뒤 작성

    반환되는 타입은 타입추론 이용하여 생략 가능

     

    ➡️ 타입 추론 : 리턴값을 작성하지 않아도 TypeScript 컴파일이 스스로 판단해서 타입을 넣어줌

     

    만약 함수에 리턴값이 없으면 void를 사용하여 작성할 수 있음

    let printAnswer = (): void => {
    	console.log("YES");
    }

    매개변수에 맞춰서 전달인자를 전달해야함

    let greeting = (firstName: string, lastName: string): string => {
    	return `hello, ${firstName} ${lastName}`;
    }
    
    //에러가 납니다.
    greeting('coding');
    
    //정상적으로 작동합니다.
    greeting('coding', 'kim');
    
    //너무 많은 매개변수를 보내 에러가 납니다.
    greeting('coding', 'kim', 'hacker');

    전달인자를 전달하지 않았거나 undefined를 전달했을 때 할당될 매개변수의 값을 정해놓을 수 있음. JS에서 default parameter와 같은 동작을 함. 뒤의 인자로 undefined를 보내도 "hello, coding kim"으로 반환함. 

    let greeting = (firstName: string, lastName: string ="kim"): string => {
    	return `hello, ${firstName} ${lastName}`;
    }
    
    //정상적으로 작동합니다. 
    greeting('coding');
    
    //정상적으로 작동합니다.
    greeting('coding', undefined);
    
    //너무 많은 매개변수를 보내 에러가 납니다.
    greeting('coding', 'kim', 'hacker');

    또는 선택적 매개변수로 할 때 매개변수 이름 끝에 물음표(?)를 붙일 수 있음

    let greeting = (firstName: string, lastName?: string): string => {
    	return `hello, ${firstName} ${lastName}`;
    }

    TypeScript의 연산자 활용 타입

    연산자를 이용해 타입을 정할 수 있는데 JS에서 || (OR) 연산자나 && (AND)와 같은 연산자를 이용하여 만들 수 있음. | 연산자를 이용한 타입을 유니온(Union) 타입이라 하며, & 연산자를 이용한 타입은 인터섹션(Intersection) 타입이라 함

     

    유니온(Union) 타입

    ➡️ 둘 이상 타입을 합쳐서 만든 타입. | 연산자를 이용해 JS에서의 || (OR) 연산자와 같은 것

    function printValue(value: number|string): void {
      if (typeof value === "number") {
        console.log(`The value is a number: ${value}`);
      } else {
        console.log(`The value is a string: ${value}`);
      }
    }
    
    printValue(10); // The value is a number: 10
    printValue("hello"); // The value is a string: hello

    typeof 연산자를 사용하여 검사후 해당 값이 숫자인지 문자열인지 다른 로그를 출력함. 다양한 타입의 값을 처리할 때 유용

     

    • 타입을 추론할 수 있어 API를 쉽게 자동완성으로 얻어낼 수 있음 (any 타입을 사용하면 타입을 추론할 수 없어 자동완성 기능 x) 

    • 가독성을 높일 수 있음. 선언된 변수인 문자, 숫자, 불리언 타입 중 하나의 값을 가질 수 있어 명시적으로 표시되어 코드를 이해하기 쉬움
    let value: string | number | boolean;

     

    ※ 유의해야 할 점 : 유니온에 있는 모든 타입에 공통인 멤버들에만 접근할 수 있기 때문에 유의 (나머지 프로퍼티에도 접근하려면 타입가드를 사용) 

    → 타입 가드 : TypeScript에서 타입을 보호하기 위해 사용되는 기능 중 하나. 특정 코드 블록에서 타입의 범위를 제한해 코드 블록 안에서 타입 안정성을 보장함

    interface Developer {
      name: string;
      skill: string;
    }
    
    interface Person {
      name: string;
      age: number;
    }
    function askSomeone(someone: Developer | Person) {
      // in 연산자 : 타입스크립트에서 객체의 속성이 존재하는지를 체크하는 연산자
      // in 연산자는 객체의 속성 이름과 함께 사용하여 해당 속성이 객체 내에 존재하는지 여부를 검사
      if ('skill' in someone) {
        console.log(someone.skill);
      }
    
      if ('age' in someone) {
        console.log(someone.age);
      }
    }

    in 연산자로 객체의 프로퍼티 이름이랑 사용되며 객체 내에 존재하는지 여부를 검사함

     

     

    인터섹션(Intersection) 타입

    ➡️ 둘 이상 타입을 결합하여 새로운 타입을 만듦. & 연산자 사용

    interface Developer {
      name: string;
      skill: string;
    }
    
    interface Person {
      name: string;
      age: number;
    }
    
    type User = Developer & Person;

    User는 Developer, Person 각각 정의된 속성을 모두 받게 됨. 하나의 단일 타입으로 표현되기 때문에 타입가드 필요x

     

    function askSomeone(someone: Developer & Person) {
      console.log(someone.age);
    	console.log(someone.name);
    	console.log(someone.skill);
    }

    askSomeone 함수는 전부 접근할 수 있음. 

    'FE' 카테고리의 다른 글

    과제2. Proxy를 설정해 HTTP 통신하기  (0) 2023.08.02
    Component Library  (0) 2023.07.23
    React Custom Component  (0) 2023.07.20
    [React] 심화  (0) 2023.07.19
    [React] 심화  (0) 2023.07.18
Designed by Tistory.