본문 바로가기

JavaScript

타입스크립트 기초문법1

728x90

타입스크립트 기초문법1


📌 초기 세팅

tsc --init
npm -init y

npm i @types/node

 

 

📄  tsconfig.json

{
  // scr 폴더 하위의 모든 .ts 확장 파일
  "include": ["src/**/*.ts"],
  "compilerOptions": {
    "lib": ["ES2021"], 
    // esModuleInterop 속성이 위의 코드 처럼 true로 설정될 경우, ES6 모듈 사양을 준수하여 CommonJS 모듈을 가져올 수 있게 됩니다.
    // e.g. typescript-test.ts => import express from "express"
    "esModuleInterop": true,
    "target": "ES2021",
    "outDir": "dist",
    "strictNullChecks": true
  }
}

"nom" 없어도 에러 발생 안함!

 

tsc

dist-test.js

dist 폴더로 outDirectory 파일 관리


📌 ts 빠른 실행

npm i -g ts-node
npm i -D ts-node

명시해주기 위해 -Dev로 한번 더 설치해줌.

 

📌 실행

ts-node src/test.ts

test.js 파일 생성없이 실행 가능!

compile하고 실행시키는 번거로움을 덜어줌.

하지만 


원시타입

 

📌 boolean

let isDone: boolean = true;

 

📌 number

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

 

📌 string

let fullName: string = `Bob Bobbington`;
let age: number = 37;
let sentence: string = `Hello, my name is ${ fullName }.
I'll be ${ age + 1 } years old next month.`;

 

📌 array

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

let list3: string[] = ['안','녕','하','세','요'];
let list4: Array<string> = ['안','녕'];

 

📌 tuple

let x: [string, number];

x = ["hello", 10];

console.log(x[0].substring); // 타입
array tuple
한 가지 type만 가짐 여러가지 type 가질 수 있음

 

📌 enum

enum Color {Red, Green, Blue}

let c: Color = Color.Green; // c = 1
console.log(c);

아무런 설정이 없으면 0부터 increment

 

enum Color {Red=1, Green, Blue}

let c: Color = Color.Green; // c = 2
console.log(c);

1부터 시작하게 하면 1부터 increment

 

enum Color {Red=1, Green, Blue}

let colorName: string = Color[2]; // Green
console.log(colorName);

 

📌 any

let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false;

어떤 기본형 타입을 사용해도 오류 발생하지 않음

 

📌 void

function warnUser(): void {
    console.log("This is my warning message");
}

 

📌 never

절대 발생할 수 없는 타입

// never를 반환하는 함수는 함수의 마지막에 도달할 수 없다.
function error(message: string): never {
    throw new Error(message);
}

// never를 반환하는 함수는 함수의 마지막에 도달할 수 없다.
function infiniteLoop(): never {
    while (true) {
    }
}

 

📌 object

원시타입이 아닌 타입

즉, number, string, boolean, bigint, symbol, null, 또는 undefined 가 아닌 나머지

// | => union 타입 강의 찍을때 교차타입이라고 설명을 잘못했습니다.
function create(o: object | null): void {}

create({ prop: 0 }); // 성공
create(null); // 성공

create(42); // 오류
create("string"); // 오류
create(false); // 오류
create(undefined); // 오류

인터페이스

상호 간에 정의한 약속 혹은 규칙을 의미합니다.

  • 객체의 스펙(속성과 속성이 타입)
  • 함수의 파라미터
  • 함수의 스펙(파라미터, 반환 타입)
  • 배열과 객체를 접근하는 방식
  • 클래스
function printLabel(labeledObj: { label: string }) {
    console.log(labeledObj.label);
}

let myObj = {size: 10, label: "Size 10 Object"};
printLabel(myObj);

interface LabeledValue {
    label: string;
}

function printLabel(labeledObj: LabeledValue) {
    console.log(labeledObj.label);
}

let myObj = {size: 10, label: "Size 10 Object"};
printLabel(myObj);

문자열 타입이 길어질 수 있음. {label: string, time: number, ...}

그래서 이를 interface로 다시 작성.

 


📌 선택적 프로퍼티(Optional Properties)

interface CraftBeer {
    name: string;
    hop?: number;
  }
  
  let myBeer = {
    name: "Saporo",
    // hop: 34,
    // test: "test",
  };
  
  function brewBeer(beer: CraftBeer) {
    console.log(beer.name); // Saporo
    // console.log(beer.hop); // 34
  }
  
  brewBeer(myBeer);

 

속성 끝에 ?를 붙여 옵션 속성을 설정

hop은 넣어줘도 되고 안넣어줘도 됨.

 

 

인터페이스에 선언한 속성값만 있다면, 오류 발생하지 않음.

하지만 myBeer에 name이 없다면 오류가 발생함.

property missing type 에러


📌 읽기전용 프로퍼티 (Readonly properties)

값 변경 불가능

객체 안에 속성(Property)만 readonly를 넣어주면 됨.

interface Point {
    readonly x: number;
    readonly y: number;
}

let p1: Point = { x: 10, y: 20 };
p1.x = 5; // 오류!

console.log(p1.x);
readonly property(속성)
const variable(변수)

📌 함수 타입

interface login {
    (username: string, password: string): boolean;
  }

let loginUser: login;

loginUser = function(id: string, pw: string) {
  console.log('로그인 했습니다');
  return true;
}

📌 클래스 타입

클래스의 속성이랑 메소드(클래스 내부 함수) 정의해 줄 수 있다.

interface CraftBeer {
    beerName: string;
    nameBeer(beer: string): void;
    // test: string;
  }
  
  class myBeer implements CraftBeer {
    beerName: string = "Baby Guinness";
    nameBeer(b: string) {
      this.beerName = b;
    }
    constructor() {}
  }

📌 인터페이스 확장

interface Person {
    name: string;
  }
  
  interface Developer extends Person {
    skill: string;
  }
  
  let fe = {} as Developer; // Developer 타입이다.
  
  fe.name = 'josh';
  fe.skill = 'TypeScript';

fe는 상속을 받았으므로  Person의 속성 name 사용 가능

 

📌 다중 상속

interface Person {
  name: string;
}

interface Drinker {
  drink: string;
}

interface Developer extends Person, Drinker {
  skill: string;
}

let fe = {} as Developer;
fe.name = 'josh';
fe.skill = 'TypeScript';
fe.drink = 'Beer';

다중 상속 가능

'JavaScript' 카테고리의 다른 글

후발대_node.js 숙력주차 과제 복습  (0) 2023.01.19
타입스크립트 기초문법2  (0) 2023.01.18
TypeScript란?  (0) 2023.01.16
javascript 구조 분해 할당  (0) 2023.01.16
Web Socket 채팅방 만들기_4  (0) 2023.01.12