타입스크립트(Typescript) 내용 정리

2019. 12. 5. 23:55 - mr.november11

 

Typescript

 

초기 구축

npm 초기화

npm init --yes 

typescript 설치

npm install -g typescript

typescript 컴파일

tsc <NAME>.ts     // Default인 ES3로 컴파일 
tsc <NAME>.ts -t ES5 // ES5로 컴파일 

typescript 초기화 (tsconfig.json 생성)

  • tsconfig.json 파일 생성 후 tsc 명령어로 컴파일 실행
tsc --init

 

tsconfig.json 파일 noImplicitAny 설정 : 타입 선언이 없는 변수를 자동으로 any로 지정하는 설정

// hello.ts 

function add(a,b) {
    console.log(a+b)
}
  • noImplicitAny : false 일 경우 → 자동으로 any로 형태 변환함
~/study/typescript/hello2  tsc                                                                                                                                                                                    2 ↵  docker-desktop ⎈  19:15:49 
~/study/typescript/hello2 
  • noImplicitAny : true 일 경우 → 타입 선언이 없을 경우 에러 발생
~/study/typescript/hello2  tsc                                                                                                                                                                                    2 ↵  docker-desktop ⎈  19:14:57 
hello.ts:1:14 - error TS7006: Parameter 'a' implicitly has an 'any' type.

1 function add(a,b) {
               ~

hello.ts:1:16 - error TS7006: Parameter 'b' implicitly has an 'any' type.

1 function add(a,b) {
                 ~
Found 2 errors.

typescript 변수 정리

null vs undefined 비교

  • null은 값으로 인식되어 object 타입이 되기 때문에 사용하지 않는 것이 좋다. (undefined를 권장)
// null 자체는 비어있는 object type이 된다
// undefinded는 미할당되었기 때문에 undefinded 타입임
console.log(null === undefined)         // false : === 은 값 뿐만 아니라 type 까지 검사 하기 때문에 
console.log(null == undefined)          // true : 두 개의 값이 동일하게 없기 때문에 
console.log(undefined == undefined)     // true : 할당되지 않아 동일하기 때문에

typescript 함수 정리

기명 함수(이름을 지정한 함수)는 호이스팅 된다

  • 함수를 선언하기 전에도, 함수를 선언한 후에도 호출할 수 있다(like var 변수).

익명 함수를 지정하면 호이스팅 되지 않는다

  • 선언한 후에만 사용할 수 있다.
    resultMultiplication(1,2)  <- 익명함수이기 때문에 선언하기 전에 호출 불가 (컴파일 실패함) 
    let resultMultiplication = function (a,b) { return a * b }
    resultMultiplication(1,2)

Class 정리

생성자(constructor) 함수의 매개변수에 접근 제한자(public, private, protected)가 생략되면 생성자 내부에서만 접근 할 수 있다. 그러나 접근 제한자나 readonly가 붙으면 멤버 변수가 된다.

//typescript
constructor(defaultBalance: number = 0, protected bankName : string = "happy bank", 
                readonly interestRate : number = 0.1 ){

        this.balance = defaultBalance
    }
//javascript
class Account {
    constructor(defaultBalance = 0, bankName = "happy bank", interestRate = 0.1) {
        this.defaultBalance = defaultBalance;
        this.bankName = bankName;
        this.interestRate = interestRate;
        this.balance = defaultBalance;
    }

Module 정리

default 모듈과 일반 모듈을 import할 때 default 모듈은 이름만 선언하고 일반 모듈은 {} 내부에 모듈 이름을 선언해야 한다.

//default 모듈 import
import profile from './default'

// default, 일반 모듈 import 
import p, {hello} from './default2' 

Type casting 정리

1. + 연산자

// ts 코드
let myNum : any = "2017"
let num1 = +myNum

console.log(typeof myNum, myNum)
console.log(typeof num1, num1)

// 실행 결과 
string 2017
number 2017

2. parseInt 함수

// ts 코드
let myNum : any = "2017"
let num1 = parseInt(myNum)

console.log(typeof myNum, myNum)
console.log(typeof num1, num1)

let myNum2 : any = "2017년"
let num2 = parseInt(myNum2)

console.log(typeof myNum2, myNum2)
console.log(typeof num2, num2)

// 실행 결과
string 2017
number 2017
string 2017년
number 2017    <- parseInt 함수는 숫자에 여러 문자가 섞여 있어도 숫자만을 선택하여 반환한다 

3. Number 함수

// ts 코드
let myNum : any = "2017"
let num1 = parseInt(myNum)

console.log(typeof myNum, myNum)
console.log(typeof num1, num1)

let myNum2 : any = "2017년"
let num2 = Number(myNum2)

console.log(typeof myNum2, myNum2)
console.log(typeof num2, num2)

// 실행 결과
string 2017
number 2017
string 2017년
number NaN     <- Number 함수는 숫자와 문자가 섞여있을 경우 NaN을 반환한다 

RxJS를 활용한 데이터 스트림 처리

RxJS는 데이터 스트림에 대한 연산을 연산자(operator) 메서드를 이용해 연쇄적으로 처리한다.

  • 설치 방법
npm install @reactivex/rxjs@5.5.6 --save
  • 예제
// ts 코드
import * as rx from '@reactivex/rxjs'

rx.Observable.of("a", "b", "c").subscribe((v) => console.log(v))

// js 코드(ES5) 
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var rx = require("@reactivex/rxjs");
rx.Observable.of("a", "b", "c").subscribe(function (v) { return console.log(v); });

// 실행 결과
a
b
c

Async/Await (비동기 함수를 동기화하기)

async/await는 ES6(ES2015) 로 컴파일 해야한다.

호출하는 함수는 Promise 구문을 포함해 비동기 처리를 수행할 수 있어야 한다.

//ts
function delay2(msg : string) {
    let ms : number = Math.floor(Math.random() * 1000 + 1)
   
    return new Promise(function(resolve){
        setTimeout(resolve, ms, msg)
    }).then(function(v){
        console.log(v, ms+"ms")
    })
}

async function sync2(){
    await delay2("A")
    await delay2("B")
    await delay2("C")
}

sync2()

// 실행 결과
A 787ms
B 396ms
C 631ms

Javascript 라이브러리를 타입스크립트에서 사용하려면 *.d.ts 파일로 된 타입 정의 파일(type definition file)이 있어야 한다.

typescript 용 javascript 라이브러리 검색

webpack 번들링

webpack 설치

npm install -g webpack@3.11.0

// 실행 예제
webpack entry1.js build1.js

for문 대체 함수

map 함수

var names = ["Jack", "Jecci", "Ram", "Tom"];
var upperCaseNames = [];
for(let i=0, totalNames = names.length; i< totalNames ; i= i +1) {
    upperCaseNames[i] = names[i].toUpperCase();
}

console.log(names)
console.log(upperCaseNames)


var names2 = ["Jack", "Jecci", "Ram", "Tom"];
var upperCaseNames2 = names.map(name => name.toUpperCase());

console.log(names2)
console.log(upperCaseNames2)

forEach 함수

function print(name) {
    console.log(name);
 }
 var names = ["Jack", "Jecci", "Ram", "Tom"];

 for(let i=0, totalNames = names.length; i< totalNames ; i= i +1) {
     print(names[i])
 }

 names.forEach((name) => print(name) )

filter 함수

function isOdd(n) {
    return n %2;
 }
 var numbers = [1,2,3,4,5];
 var odd = [];
 for(let i=0, total = numbers.length; i< total ; i= i +1) {
    let number = numbers[i];
    if( isOdd(number) ) {
       odd.push(number);
    }
 }

 console.log(odd)

 var odd2 = numbers.filter(n => n % 2 )

reduce 함수

var numbers = [1,2,3,4,5]
var result = 0;
for(let i=0, total = numbers.length; i< total ; i= i +1) {
   result = result + numbers[i];
}

console.log(result)

var result2 = numbers.reduce((acc, val) => acc + val, 0)

console.log(result2)

다른 카테고리의 글 목록

Javascript 카테고리의 포스트를 톺아봅니다