TypeScript

[TypeScript] 프로젝트 환경설정과 문법

Summer.dev 2023. 5. 30. 15:25

TypeScript 프로젝트 환경 설정

1. 프로젝트 폴더 생성

mkdir (폴더명)
cd (폴더명)

2. 프로젝트 초기화

npm init -y

3. 타입스크립트 설치

npm install typescript --save-dev

4. 루트 디렉토리에 tsconfig.json 파일 생성 후 아래 코드작성

{
  "compilerOptions": { //컴파일러옵션설정
    "target": "es6",
    "module": "commonjs",
    "sourceMap": true,
    "outDir": "./dist"
  },
  "include": [ //TypeScript 파일 경로 src외에서 파일생성시 오류난다
    "src/**/*"
  ]
}

5. src 폴더에 index.ts 파일 만들어 TypeScript 코드 작성해보기

기본타입

String

let str: string = 'hello';

Boolean

let isDone: boolean = false;
let isShow: boolean = true;

Number

let num1: number = 7;
let num2: number = 0.6878;

Object

let obj: object = {};
let obj2: { name: string; age: number; isDeveloper: boolean } = {
  name: 'kimcoding',
  age: 20,
  isDeveloper: true,
};

Array

let list1: number[] = [1, 2, 3];
let list2: Array<number> = [1, 2, 3];

Tuple

let list5: [number, string, boolean] = [1, 'banana', true];

arr[0].concat('abc'); // Error, 'number' does not have 'concat'
arr[8] = 'hello'; // Error, Property '5' does not exist on type '[string, number]'.

Any

let obj: object = {};

//에러가 납니다.
obj = "hello";

let maybe: any = 4;

//정상적으로 동작합니다.
maybe = true;

Void: 함수에 리턴값이 없다면 사용

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

Never: 함수의  끝까지 실행되지 않는다는 의미

function neverEnd(): never {
  while (true) {

  }
}

유니온 타입

: 자바스크립트의 OR연산자(||)와 같이 A이거나 B라는 의미의 타입

function printValue(value: any): 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

매개변수의 타입을 any로 사용시 자바스크립트와 다를바가 없다.

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

매배변수의 타입을 유니온타입으로 작성시 number 혹은 string 타입으로 지정할 수 있다.

 

유니온 타입을 사용하면 any와 달리 타입을 명시적으로 표시되기 때문에 가독성이 좋고

타입을 추론할 수 있기 때문에 타입에 관련된 API를 자동완성으로 알아낼 수 있다.

 

유니온 타입 사용시 주의할 점?

유니온에 있는 모든 타입의 공통 프로퍼티에만 접근할 수 있다.

나머지 프로퍼티에 접근하고 싶다면 타입가드를 사용해야 한다.

타입가드란 TypeScript에서 특정 코드 블록에서 타입의 범위를 제한해 해당 코드 블록 안에서 타입의 안정성을 보장해준다.
function askSomeone(someone: Developer | Person) {
  // in 연산자 : 타입스크립트에서 객체의 속성이 존재하는지를 체크하는 연산자
  // in 연산자는 객체의 속성 이름과 함께 사용하여 해당 속성이 객체 내에 존재하는지 여부를 검사
  if ('skill' in someone) {
    console.log(someone.skill);
  }

  if ('age' in someone) {
    console.log(someone.age);
  }
}

in 연산자는 객체의 프로퍼티 이름과 함께 사용되며, 해당 프로퍼티가 객체 내에 존재하는지 여부를 검사한다.

 

인터섹션 타입

: 둘 이상의 타입을 결합해서 새로운 타입을 생성

interface Developer {
  name: string;
  skill: string;
}

interface Person {
  name: string;
  age: number;
}

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

인터섹션 타입을 사용해서 Developer와 Person으로 하나의 타입을 생성했다.

따라서 askSomeone함수 내에서는 정의된 모든 프로퍼티에 접근 할 수 있다.

interface Developer {
  name: string;
  skill: string;
}

interface Person {
  name: string;
  age: number;
}

function askSomeone(someone: Developer | Person) {
	//이런 식으로 프로퍼티에 접근할 수 있습니다.
  if ('skill' in someone) {
    console.log(someone.skill);
  }

  if ('age' in someone) {
    console.log(someone.age);
  }
}

//유니온 타입은 전달인자를 전달할 때 선택지가 생깁니다.
askSomeone({name: '김코딩', skill: '웹 개발'});
askSomeone({name: '김코딩', age: 20});

function askSomeone2(someone: Developer & Person) {
	//타입 가드를 사용하지 않아도 모든 프로퍼티에 접근할 수 있습니다.
    console.log(someone.age);
	console.log(someone.name);
	console.log(someone.skill);
}

//그러나 인터섹션 타입으로 결합하게 된다면 전달인자를 전달할 때 선택지가 없습니다.
askSomeone2({name: '김코딩', skill: '웹 개발', age:20});

유니온 타입은 타입을 지정하거나 다양한 타입의 값을 처리하는 경우

인터섹션은 두 개 이상의 타입을 조합하고, 해당 타입들이 모두 충족되어야 하는 경우에 유용하다.

 

https://www.typescriptlang.org/docs/handbook/2/everyday-types.html

 

Documentation - Everyday Types

The language primitives.

www.typescriptlang.org