Million Dreams
100만개의 꿈을 꾸는 개발자 지망생
TypeScript (11)
Do it! 타입스크립트 프로그래밍 3장

Chap03 객체와 타입

3-1) 타입스크립트 변수 선언문

(1) 타입스크립트 기본 제공 타입

자바스크립트와 타입 스크립트 타입의 비교

유형

자바스크립트 타입

타입스크립트 타입

수 타입

Number

number

불리언 타입

Boolean

boolean

문자열 타입

String

string

객체 타입

Object

object

 

(2) letconst 키워드

- ES5 자바스크립트는 variable 앞 세 글자를 딴 var 키워드를 사용해 변수를 선언할 수 있음

 

- 그러나 var는 다른 프로그래밍 언어와 다르게 동작하기 때문에 ESNext 자바스크립트는 letconst라는 키워드를 도입해 다른 프로그래밍 언어와 같은방식으로 만듦

 

let 사용법 – let은 코드에서 그 값이 수시로 변경될 수 있음을 암시

let 변수 이름 [=초깃값]

 

const 사용법 – const는 코드에서 그 값이 변숫값이 절대 변하지 않는다는 것을 암시

const 변수 이름 = 초깃값

 

(3) 타입 주석

- 타입스크립트는 자바스크립트 변수 선언문을 확장해 다음과 같은 형태로 타입을 명시할 수 있으며 이를 타입 주석(type annotation)이라고 함

 

let 변수 이름: 타입 [=초깃값]

 

const 변수 이름: 타입 = 초깃값

 

 

 

n,b,s는 각각의 타입이 일치하지 않으므로 타입 불일치 오류가 발생한다.

 

(4) 타입 추론

- 타입스크립트는 자바스크립트와 호환성을 위해 타입 주석 부분을 생략할 수 있다.

 

- 이 경우 대입 연산자(=) 오른쪽 값에 따라 변수 타입을 지정하며 이를 타입 추론(type inference)라고 함

 

- 각 변수는 초깃값에 따라 타입을 추론하므로 각 변수는 초깃값에 해당하는 타입으로 지정되며, 이후에는 해당 타입의 값만 저장할 수 있음

 

(5) any 타입

- 타입스크립트는 자바스크립트와의 호환을 위해 any라는 타입의 이름을 제공

 

- any 타입은 값의 타입과 무관하게 어떤 종류의 값도 저장 가능

 

(6) undefined 타입

- 자바스크립트에서 undefined는 값이며, 변수를 초기화하지 않으면 해당 변수는 undefined 값을 가짐.

- 그러나 타입스크립트에서 undefined는 타입이기도 하며 값이 기도 함

Undefined 타입의 예

let u: undefined = undefined

u = 1 // Type '1' is not assignable to type 'undefined' 오류 발생

 

 

타입의 상속 관계

Any > (number, boolean, string) , (object) > undefined

 

(7) 템플릿 문자열

- 타입스크립트에는 변수에 담긴 값을 조합해 문자열을 만들 수 있게 하는 템플릿 문자열(template string)을 제공

- 역따옴표(backtick) `으로 문자열을 감싸고, 변수를 ${}기호로 감싸는 형태로 만들 수 있음

`${변수 이름}`

Template string 예시

let count = 10message = 'Your account'

let result = `${message} is ${count}`

console.log(result)

 

 

 

3-2) 객체와 인터페이스

- object 타입은 인터페이스와 클래스의 상위 타입으로, number, boolean, string 타입의 값을 가질 수는 없지만, 속성 이름이 다른 객체를 모두 자유롭게 담을 수 있음

Object 타입 예시

let o: object = {name: 'Jack', age: 32}

o = {first: 1, second: 2}

 

- 단 위의 예시의 경우 o는 항상 nameage 속성으로 구성된 객체만 가질 수 있으므로 2행에서는 오류가 발생함.

 

(1) 인터페이스 선언문

- 타입스크립트는 객체의 타입을 정의할 수 있게 하는 interface 키워드를 제공

- 인터페이스는 객체의 타입을 정의하는 것이 목적이므로 다음처럼 객체를 의미하는 중괄호 {}로 속성과 속성의 타입 주석을 나열하는 형태로 사용

interface 인터페이스 이름 {

 속성 이름[?]: 속성 타입[,…]

}

- 인터페이스의 목적은 인터페이스 내 속성과 이름이 모두 일치하는 객체만 유효하도록 객체의 타입 범위를 좁히는 데 있다.

 

(2) 선택 속성 구문

- 인터페이스 설계시 속성에 따라 꼭 필요한 것과 있어도 되고 없어도 되는 형태로 만들고 싶을 때는 선택 속성(optional property)을 사용함

- 선택 속성은 속성 이름 옆에 ?를 붙여서 만듦

선택 속성 예시

interface IPerson2 {

    name: string // 필수 속성

    age: number // 필수 속성

    etc?: boolean // 선택 속성

}

 

let good1: IPerson2 = {name: 'Jack', age: 32}

let good2: IPerson2 = {name: 'Jack', age: 32, etc: true}

 

(3) 익명 인터페이스

- 타입스크립트는 interfacㄷ 키워드도 사용하지 않고 인터페이스의 이름도 없는 인터페이스를 만들 수 있으며 이를 익명 인터페이스(anonymous interface)라고 함

익명 인터페이스 예시

let ai: {

    name: string

    age: number

    etc?: boolean

= {name: 'Jack', age: 32}

 

- 익명 인터페이스는 주로 다음과 같이 구현시 사용

 

3-3) 객체와 클래스

(1) 클래스 선언문

- 타입스크립트는 C++나 자바와 같은 객체지향 언어에서 흔히 볼 수 있는 class, private, public, protecte, implements, extend와 같은 키워드를 제공, 문법적인 차이만 있을 뿐 의미는 동일

Class 클래스 이름 {

[private | proteced | public] 속성 이름[?]: 속성 타입[…]

}

 

(2) 접근 제한자

- 클래스 속성은 public, private, protect와 같은 접근 제한자(access modifier)를 이름 앞에 붙일 수 있음. 생략하면 public으로 간주

 

(3) 생성자

- 타입스크립트 클래스는 constructor라는 이름의 특별한 메서드를 포함하며, 이를 생성자(constructor)라고 함.

- 다른 언어와 달리 타입스크립트 클래스는 클래스 속성을 선언할 수 있지만, 생성자의 매개변수에 public 같은 접근 제한자를 붙이면 해당 매개변수의 이름을 가진 속성이 클래스에 선언된 것처럼 동작함.

Public을 선언한 Person2와 선언하지 않은 Person3 클래스의 차이점 살펴보기

class Person2 {

    constructor(public name: stringpublic age?: number) {}

}

 

let jack2 : Person2 = new Person2('Jack'32)

console.log(jack2)

 

class Person3 {

    name: string

    age?: number

    constructor(name: stringage?: number) {

        this.name = namethis.age = age

    }

}

let jack3: Person3 = new Person3('Jack'32)

console.log(jack3)

 

(4) 인터페이스 구현

다른 객체지향 언어처럼 타입 스크립트 클래스는 인터페이스를 구현할 수 있으며 implements 키워드를 사용함

class 클래스 이름 implements 인터페이스 이름 {

}

인터페이스를 구현할 때 속성을 정의하는 것은 이러한 속성이 있어야 한다는 규약만을 나타내는 것이기 때문에 물리적으로 해당 속성을 만들지 않으므로, 클래스 body 부분에 반드시 인터페이스 속성을 멤버 속성으로 표현해주어야 함

interface IPerson4 {

    name: string

    age?: number

}

 

class Person4 implements IPerson4 {

    name: string

    age: number

}

 

(5) 추상 클래스

- 타입스크립트는 다른 언어처럼 abstract 키워드를 사용해 추상 클래스를 만들 수 있음

- 추상 클래스는 abstract 키워드를 class 키워드 앞에 붙여서 만들며, 자신의 속성이나 메서드 앞에 abstract를 붙여 나를 상속하는 다른 클래스에서 이 속성이나 메서드를 구현하게 함.

abstract class 클래스 이름 {

 abstract 속성 이름: 속성 타입

 abstract 메서드 이름() {}

}

(6) 클래스의 상속

- extends 키워드를 사용해 상속 클래스를 만듦

class 상속 클래스 extends 부모 클래스 { … }

 

(7) static 속성

- 다른 객체지향 언어처럼 타입스크립트 클래스는 정적인 속성을 가질 수 있다.

class 클래스 이름 {

Static 정적 속성 이름: 속성 타입

 

3-4) 객체의 비구조화 할당문

구조화가 필요한 코드 예

let personName = "Jack"

let personAge = 32

 

let companyName = 'Apple Company, Inc'

let companyAge = 43

 

이와 같은 코드는 작성도 번거로울 뿐더러 기능 확장도 어려움, 따라서 인터페이스나 클래스를 사용해 관련 정보를 묶어 새로운 타입으로 표현하는 구조화(structuring)를 사용함

import {IPersonICompanyfrom './IPerson_ICompany'

 

let jack: IPerson = {name: 'Jack', age: 32},

    jane: IPerson = {name: 'jane', age: 32}

 

let apple: ICompany = {name: 'Apple Computer, Inc', age: 43},

    ms: ICompany = {name: 'Microsoft', age: 44}

 

console.log(jack)

(1) 비구조화란?

- 구조화된 데이터는 어떤 시점에서 데이터 일부만 사용해야 할 때가 있음.

예를 들어 nameage 속성을 갖고 있는 jack 변수에서 name age를 분리해 각각

let name = jack.name, age = jack.age 와 같이 분리해서 적용해 사용하면 jack은 사용하지 않고 nameage변수만 사용하며 이를 비구조화(destructuring)라고 한다.

 

(2) 비구조화 할당

- 비구조화 할당은 ESNext 자바스크립트의 구문으로 타입스크립트에서도 사용 가능함

- 객체 뿐 아니라 배열과 튜플에도 적용 가능하며 적용하고 싶은 속성을 중괄호로 묶음

Ex) let {name, age} = jack

Jacknameage 속성을 가진 name, age 변수가 생김

 

(3) 잔여 연산자

- ESNext 자바스크립트와 타입스크립트는 점을 연이어 3개 사용하는 연산자를 제공하며 사용되는 위치에 따라 잔여 연산자(rest operator) 혹은 전개 연산자(spread operator)라고 부름

Ex) 5개 속성을 가지고 있는 변수 address에서 country, city를 제외한 나머지 속성을 별도의 detail이라는 변수에 저장하고 싶다면 잔여연산자를 detail 앞에 붙임

let address: any = {

    country: 'Korea',

    city: 'Seoul',

    address1: 'Gangnam-gu',

    address2: 'Sinsa-dong 123-456',

    address3: '789 street, 2 Floor ABC building'

}

const {countrycity...detail= address

console.log(detail)

 

 

(4) 전개 연산자

- 3개 연산자가 비구조화 할당문이 아닌 곳에서 사용될 때 전개 연산자(spread operator)라고 함

- 전개 연산자는 객체의 속성을 모두 전개해 새로운 객체로 만들어 줌

let part1 = {name: 'jane'}, part2 = {age:22}, part3 = {city: 'Seoul', country: 'Kr'};

let merged = {...part1...part2...part3}

console.log(merged)

 

 

 

3-5) 객체의 타입 변환

(1) 타입 변환

- 타입이 있는 언어들은 특정 타입의 변숫값을 다른 타입의 값으로 변환할 수 있는 기능을 제공하며 이를 타입 변환(type conversion)이라고 함

‘type conversion’, ‘type casting’, ‘type coercion’의 차이

- type conversion : type castingtype coercion을 모두 포함하는 의미

- type casting: 명시적 타입 변환(explicit type conversion)을 의미

- type coercion: 암시적 타입 변환(implicit type conversion)을 의미

 

(2) 타입 단언

- 타입스크립트는 타입 변환이 아닌 타입 단언(type assertion)이라는 용어 사용

(<타입>객체)

(객체 as 타입)

- 이들 모두 ES5 자바스크립트 구문이 아니기 때문에 자바스크립트 타입 변환과 구분하기 위해 타입 단언이라는 용어 사용

 

 

  Comments,     Trackbacks
Do it! 타입스크립트 프로그래밍 2장

Chap02 타입스크립트 프로젝트 생성과 관리

- 타입스크립트 개발 방법, 타입스크립트 import, export를 사용해 여러 개 소스 파일 관리, tsc 설정파일 tsconfig.json

 

2-1) 타입스크립트 프로젝트 만들기

- 순서는 Node.js프로젝트를 먼저 만들고, 개발 언어를 타입스크립트로 설정하는 방식으로 진행

- Node.js 프로젝트는 디렉터리를 하나 만들고, package.json란 이름의 파일을 만드는 것으로 시작(터미널에서 npm init)으로 실행

 

(1) 프로젝트 생성자 관점에서 패키지 설치하기

- package.json 파일을 만들었다면 프로젝트 구현에 필요한 다양한 오픈소스 패키지를 npm install 또는 npm I 명령으로 설치하는데 이 때 2가지 옵션을 줄 수 있음

* npm I 옵션

--save : 프로젝트 실행할 때 필요한 패키지로 설치, 패키지 정보가 package.json 파일의 ‘dependencies’ 항목에 등록됨 (단축명령 : -S)

--save-dev : 프로젝트 개발할 때만 필요한 패키지로 설치, 패키지 정보가 package.json 파일의 ‘devDependencies’항목에 등록됨.

 

- 타입스크립트 프로젝트는 보통 typescriptts-node 패키지를 설치하며, 이 프로젝트를 전달받아 사용하는 다른 개발자를 위해 두 패키지리를 -D 옵션으로 설치해 package.json에 등록하는 것이 좋음

npm i -D typescript ts-node

 

- 또한, 자바스크립트와 달리 타입스크립트 컴파일러는 타입이 명시적으로 설정되어 있어야만 코드가 문법에 맞게 작성되었는지 검증해 코드를 동작시키므로, 자바스크립트로 개발된 chance, ramda와 같은 라이브러리들은 추가로 @types/chance, @types/ramda와 같은 타입 라이브러리들을 제공해야함.

- @types/가 앞에 붙는 타입 라이브러리들은 항상 index.d.ts라는 이름의 파일을 갖고 있으며, 타입스크립트 컴파일러는 이 파일의 내용을 바탕으로 chance, ramda와 같은 라이브러리가 제공하는 함수들을 올바르게 사용했는지 검증함.

- 타입스크립트는 또한 웹 브라우저나 노드제이에스가 기본으로 제공하는 타입들의 존재도 그냥은 알지 못하므로, @types/node라는 패키지를 설치해야 함

npm i -D @types/node

 

(2) 프로젝트 이용자 관점에서 패키지 설치하기

- 프로젝트를 만드는 과정과 이용하는 과정도 다른데, 프로젝트를 만드는 과정에서 패키지를 설치하면 자연스럽게 프로젝트 디렉터리 아래에 node_modules이라는 디렉터리가 생기고, 해당 패키지가 설치됨

- 그러나 보통은 프로젝트 구현시 여러 패키지를 설치하므로 node_modules 디렉터리 크기가 매우커져 프로젝트 전달할 떄는 node_modules 디렉터리를 모두 지우고 전달함.

- 그러므로 다른 사람이 작성한 프로젝트를 전달받아 이용할 때는 package.json 파일이 있는 디렉터리에서 npm i를 실행하면 package.json에 등록된 패키지들이 node_modules 디렉터리에 자동으로 설치됨

 

(3) tsconfig.json 파일 만들기

- 타입스크립트 프로젝트는 타입스크립트 컴파일러 설정 파일인 tsconfig.json 파일이 있어야 하며 tsc --init 명령으로 만들 수 있다.

이 책에서 기본적으로 사용하는 tsconfig.json 파일

{

  "compilerOptions": {                         

    "module""commonjs",

    "esModuleInterop"true,

    "target""es5"

    "moduleResolution""node",

    "outDir""dist"

    "baseUrl"".",                   

    "sourceMap"true,                     

    "downlevelIteration"true,                                   

    "noImplicitAny"false,

     "paths": { "*"["node_modules/*"] } 

  },

  "include"["src/**/*"]

}

 

(4) src 디렉터리와 소스 파일 만들기

- 앞서 만든 tsconfig.json 파일에 있는 include 항목에 설정되어 있는 [“src/**/*”]값은 ./src./src/utils 디렉터리에 이 프로젝트의 모든 타입스크립트 소스 파일이 있다는 뜻이다.

- tsconfig.json 설정대로 프젝트를 구성하고자 src/utils 디렉터리를 생성한다.

 

- 또한 실습용 소스파일을 만든다.

 

 

- 각각의 파일을 작성한다.

makePerson.ts

export function makePerson(name: stringage:number) {

    return {name: name, age: age}

}

export function testMakePerson() {

    console.log(

        makePerson('Jane'22),

        makePerson('Jack'33)

    )

}

 

 

index.ts

import {testMakePersonfrom './utils/makePerson'

testMakePerson()

 

시작 소스 파일명을 index로 짓는 이유

- nodets-node로 소스 파일을 실행하려면 ts-node ./src/index.ts 명령을 사용하지만,

소스 파일명이 index 이면 ts-node ./src로도 실행할 수 있기 때문 (간편해짐)

 

(5) package.json 수정

- 타입스크립트 프로젝트 개발시 ts-node를 사용하지만. 개발이 완료되면 ES5 자바스크립트 코드로 변호나해 node로 실행해야 하므로 package.json 파일의 scripts 항목에 dev build 명령을 추가한다.

Dev : 개발 중 src 디렉터리에 있는 index.ts 파일을 실행하는 용도로 사용,

Build : 개발이 완료된 후 프로그램을 배포하기 위해 dist 디렉터리에 있는 ES5 자바스크립트 파일을 만들 때 사용

 

2-2) 모듈 이해하기

- 타입스크립트에서 index.ts와 같은 소스 파일을 모듈이라고 한다.

- 모듈마다 고유한 기능을 구현하는 방식으로 소스코드를 분할하는 것을 모듈화라고 한다.

- 모듈화로 분할 시 어떤 모듈에 어떤 내용이 있는지를 서로 알게 해줘야 하므로, import·export 키워드를 사용해 기능을 공유한다.

 

(1) index.ts 파일의 모듈화 (실습)

- index.ts 파일을 모듈화하기 위해 src 디렉터리 아래에 person 디렉터리를 생성 후 그 안에 Person.ts라는 이름의 파일을 만든다.

 

- 그러나 이대로 실행하면 다음과 같이 이름을 찾을 수 없다고 나오는데 export import 구문을 통해 해결할 수 있다.

 

 

(2) export 키워드

- index.ts 파일 동작을 위해 Iperson, makePerson 키워드의 의미를 index.ts에 전달해야함

- 이를 위해 Person.tsIpersonmakePerson 앞에 export 키워드를 추가

export interface IPerson {

    name: string

    age: number

}

export const makePerson = (name: string,

    age:number = makeRandomNumber()) => ({nameage})

 

(3) import 키워드

- 어떤 파일이 export 키워드로 내보낸 심벌을 받아서 사용하려면 import 키워드를 사용한다.

- import 키워드 형식 2가지

import {심벌 목록} from ‘파일의 상대경로

Ex) import {IPersonmakePersonfrom './person/Person'

 

import * as 구문

- import * as 심벌 from ‘파일의 상대 경로

import * as U from '../utils/makeRandomNumber'

 

U라는 이름으로 import makeRandomNumber의 요소들을 사용하기 위해 요소 앞에 네이밍한 U를 붙여 사용

U.makeRandomNumber()) => ({nameage})

 

(4) export default 키워드

- 타입스크립트는 자바스크립트와 호환하기 위해 export default 구문 제공

- export default 키워드는 한 모듈이 내보내는 기능 중 오직 한 개에만 붙일 수 있으며, export default가 붙은 기능은 import문으로 불러올 때 중괄호{} 없이 사용 가능

export default interface IPerson {

    name: string

    age: number

}

 

import IPerson from './person/IPerson'

 

 

(5) 외부 패키지를 사용할 때 import

-S 옵션과 -D 옵션으로 설치할 수 있으며, -S은ㄴ package.json dependencies 항목에, -D 옵션으로 설치된 @types/chance@types/ramdadevDependencies 항목에 반영됨.

  "dependencies": {

    "chance""^1.1.4",

    "ramda""^0.27.0"

  },

 

  "devDependencies": {

    "@types/chance""^1.0.9",

    "@types/node""^12.12.31",

    "@types/ramda""^0.27.0",

    "ts-node""^8.8.1",

    "typescript""^3.8.3"

  },

 

Chance: 그럴듯한 가짜 데이터(fake data)를 만들어 주는데 사용됨

Ramda : 함수형 유틸리티 패키지

사용예)

import IPerson from './person/IPerson'

import Person, {makePersonfrom './person/Person'

import Chance from 'chance'

import * as R from 'ramda'

 

const chance = new Chance()

let persons: IPerson[] = R.range(02)

            .map((n:number) => new Person(chance.name(), chance.age()))

console.log(persons)

 

- chanceChange 클래스 하나만 export default 형태로 제공하며 ramda 패키지는 다양한 기능을 제공함으로 import문을 위와 같이 사용함

- chanceramda는 외부 패키지이므로 node-modules 디렉터리에 있으므로 node_modules 디렉터리에 있음.

* 복습 : run dev 명령어는 개발 중에 src 디렉터리에 있는 index.ts 파일을 실행하는 용도

Run build는 개발이 완료된 후 프로그램을 배포하기 위해 dist 디렉터리에 ES5 자바스크립트 파일을 만들 때 사용

 

2-3) tsconfig.json 파일 살펴보기

- 터미널에서 tsc –help를 실행하면 tsc 컴파일러는 컴파일 옵션과 대상 파일 목록 두가지를 입력받는 다는 것을 알 수 있음

tsc –help

Syntax:   tsc [options] [file...]     

 

- tsconfig.json 에있는 옵션 중

compilerOptions 항목은 tsc 명령 형식에서 옵션을 나타내고,

include 항목은 대상 파일 목록을 나타냄

- tsconfig 내의 각 키는 설정항목을 의미하며, 키에 설정하는 값을 키값이라고 함

둘은 콜론(:)을 기준으로 :키값형태로 작성

 

Module

- 타입스크립트 소스코드가 컴파일되어 만들어진 ES5 자바스크립트 코드는 웹 브라우저와 Nods.js 양쪽에 모두 동작해야하지만 웹 브라우저와 Node.js는 물리적으로 동작하는 방식이 달라 여러 개의 파일(모듈)로 분할된 자바스크립트 코드 또한 웹 브라우저와 Node.js 양쪽에서 다르게 작동함

-자바스크립트 모듈은 웹 브라우저에서는 AMD(asynchronous module definition) 방식으로, Node.js같은 경우 CommonJS 방식으로 동작함

- tsconfig.ts 파일에서 compilerOption 항목의 Module 키는 동작 대상 플랫폼을 구분해 맞는 방식으로 컴파일하는 목적으로 설정

Ex) 웹 브라우저 : amd

Node.js: commonjs

"module""commonjs",

 

moduleResolution

- module키 값이 coomonjsNode.js에서 동작하는 것을 의미하므로 moduleResolution키 값은 node로 설정, moduleamdmoduleResolution 키 값은 classic

"moduleResolution""node",

 

Target

- 트랜스파일할 대상 자바스크립트 버전 설정, 일반적으로 es5 값을 설정하며, 최신버전 Node.js라면 es6 설정 가능

"target""es5"

 

 

baseUrlOutDir

- baseUrl, outDir키에는 트랜스파일 된 ES5 자바스크립트 파일을 저장하는 디렉터리를 설정

-tsctsconfig.json 파일이 있는 디렉터리에서 실행되므로, 현재 디렉터리를 의미하는 “.”baseUrl을 설정하는 것이 보통.

- OutDir 키는 baseDir 설정값을 기준으로 했을 때 하위 디렉터리 이름. (예시에서는 dist를 설정했으므로 빌드 결과가 dist 디렉터리에 만들어짐)

"outDir""dist"

    "baseUrl"".",    

 

Paths

- paths 키에는 소스 파일의 import 문에서 from 부분을 해석할 때 찾아야 하는 디렉터리를 설정

- import 문이 외부 패키지이면 node-modules 디렉터리에서 찾아야하므로 키값에 node_modules/*도 포함함

"paths": { "*"["node_modules/*"] }

 

esModuleInterop

- 오픈소스 자바스크립트 라이브러리 중 웹 브라우저에서 동작을 가정으로 만들어진 것이 있는데, CommonJS 방식으로 동작하는 타입스크립트 코드에 혼란을 줄 수 있음

- chance의 경우 AMD 방식을 전제로 해서 구현된 라이브러리이므로, chance 패키지가 동작하려면 esModuleInterop 키를 반드시 true로 설정해야함.

 

sourceMap

- sourceMap 키값이 true이면 트랜스파일 디렉터리에는 .js 파일 이외에도 .js.map 파일이 만들어지므로, 이 소스맵 파일은 변환된 자바스크립트 코드가 타입스크립트 코드의 어디에 해당하는 지를 알려줌

 

downlevelIteration

- 생성기가 정상적으로 동작하려면 downlevelIteration키가 true여야함

noImplicitAny

- tscf(a,b)처럼 매개변수 a,b에 타입을 명시하지 않으면 암시적으로 any 타입을 설정한 것으로 간주

- 이 때 오류가 출력되어 문제가 있다고 알려주나, 초보자에겐 혼란스러울 수 있음

- noImplicitAnyfalse로 해두면 해당 오류가 보여지지 않음

 

  Comments,     Trackbacks
Do it! 타입스크립트 프로그래밍 1장

 

Chap01 타입스크립트와 개발 환경 만들기

1-1 타입스크립트란 무엇인가?

 

1) 세종류의 자바스크립트

- ES5(ECMAScript 5) : 웹 브라우저에서 동작하는 표준자바스크립트

 

- ESNext : 2015년부터 매년 새로운 버전을 발표하는 ESNext ES6를 포함해 ES6이후의버전들을 ESNext라고 부르기 시작했다. ES6부터는 발표연도를 붙여 ECMAScript 2015처럼 부르기로 함. 이를통들어서 ESNext라고 하며 현재는 ECMAScript 2019까지나온 상황

 

- TypeScript : ESNext의 모든 문법을 포함하되, ESNext에 타입 기능을 추가한 스크립트

 

2) 타입스크립트는 누가 만들었나?

- 마이크로소프트가 개발하고 유지하고 있는 오픈 소스 프로그래밍언어 (2012년말 발표)

 

- C# 언어를 차이샇ㄴ 아네르스 하일스베르가 핵심 개발자로 참여중

 

3) 트랜스파일

- ESNext 자바스크립트 소스코드는 바벨(Babel)이라는 트랜스파일러(transpiler)를 거치면 ES5 자바스크립트 코드로 변환되며, 타입스크립트 소스코드는 TSC(TypeScript compiler)라는 트랜스파일러를 통해 ES5 자바스크립트코드로 변환됨

 

- 트랜스파일러란, 어떤프로그래밍 언어로 작성된 소스코드를 또 다른 프로그래밍 언어로 된 소스코드로 바꿔주는 프로그램을 말함.

 

- 텍스트로 된 소스코드를 바이너리 코드로 바꿔주는 컴파일러와 구분해서사용

 

1-2 타입스크립트 주요 문법 살펴보기

1) ESNext의 주요 문법

(1) 비구조화 할당

- 비구조화 할당을 통해 각 멤버의 요소를 쉽게 분리해서 얻을 수있다.

 

(2) 화살표 함수

- 자바스크립트에서 함수를 선언할 때는 다음 코드의 01행처럼 function 키워드를 사용하지만, ESNext에서는 function 키워드 외에오 화살표(=>)로 함수 선언이 가능

 

(3) 클래스

- ESNext에서는 클래스 기능을 지원해 C++ Java 언어에서 보던 객체지향 프로그래밍을 지원한다. 캡슐화, 상속, 다형성이라는 세가지 요소 지원

 

(4) 모듈

- 모듈을 사용해 코드를 여러 개 파일로 분할해서 작성 가능. 변수, 함수, 클래스등에 export 키워드를 사용해 모듈로 만들면 다른 파일에서도 사용할 수 있다. 모듈을 가져올 때는 import 키워드 사용

 

(5) 생성기

- 타입크스립트는 물론이고 파이썬 PHP같은 프로그래밍 언어는 yield 라는 키워드를 제공,yield문은 반복자를 의미하는 반복기를생성할 때 사용

- yield문을 사용해 반복기를 만들어 내는 반복기 제공자를 생성기라고부름

- function 키워드에 (*)를결합해 function* yield 키워드를 이용해 만들며, 타입스크립트에서 yield는 반드시 function*으로 만들어진 함수 내부에서만 사용 가능

 

(6) Promise async/await구문

- ES5로는 비동기 콜백 함수를 구현하는 것이 복잡하고 번거로움

 

- Promise는 웹 브라우저와Node.js에서 모두 제공하는 기본 타입으로 비동기 콜백 함수를 상대적으로 쉽게 구현할 목적으로 만들어짐

 

- ESNext C# 4.5 버전의async/await 구문을 빌려서 여러 개의 Promise 호출을결합한 복잡한 형태의 코드를 간결하게 구현시킴.

 

2) 타입스크립트 고유의 문법

(1) 타입 주석과 타입 추론

- 콜론(:)과 타입 이름을두고 타입 주석(Type annotation)이라고 하지만 2행처럼타입스크립트는 타입 부분 생략이 가능하며, 대입 연산자(=)의오른쪽 값을 분석해 왼쪽 변수 타입을 결정하는데 이를 타입 추론(Type inference)라고 함. 타입 추론 덕분에 자바스크립트 환경인 .js .ts로만 바꾸면 타입스크립트 환경에서 바로 동작함

Ex) let n: number = 1

let m = 2

 

(2) 인터페이스

 

(3) 튜플

- 파이썬과 같은 몇몇 프로그래밍 언어에는 튜플이라는 타입이 있으며, 물리적으로는 배열과 같지만, 배열에 저장되는 아이템의 데이터타입이모두 같으면 배열, 다르면 튜플이다.

 

(4) 제네릭 타입

- 제네릭 타입은 다양한 타입을 한꺼번에 취급할 수 있게 해주는 역할.

 

(5) 대수 타입

- ADT, 추상 데이터타입(abstract data type)을 의미하기도 하지만, 대수타입이라는 의미로도 사용됨.

- 대수 타입이란, 다른자료형의 값을 가지는 자료형을 의미

- 대수 타입은 크게 합집합(unionor sum type)과 교집합(intersection or product type) 두가지가 있으며, 합집합은 ‘|’ 기호를, 교집합은 ‘&’ 기호를 사용해 여러 타입을 결합해서 만들수 있음.

 

1-3) 타입 스크립트 개발 환경 만들기

(1) scoop 프로그램 설치

 





 

Scoop install aria2

Scoop install git

 

(2) 비주얼 스튜디오 코드 설치

- Scoop bucket add extras

- Scoop install vscode

- Add Visual Studio Code as a context menuoption by running: “C:\Scoop\apps\vscode\current\vscode-install-context.reg”

 

(3) 노드제이에스 설치

- scoop install nodejs-lts

- node -v (노드제이에스 버전 확인)

 

(4) 타입스크립트 컴파일러 설치

- npm I -g typescript

- tsc -v (타입스크립트 컴파일러 버전 확인)

 

(5) touch 프로그램 설치 파일 생성시 지정 이름의 파일이 이미 있으면 무시하고, 없으면 해당 이름으로 파일을 만들어줌

- scoop install touch

 

(6) ts-node 설치(tsc는타입스크립트 코드를 ES5 형식 자바스크립트 코드로 변환만 할 뿐 실행하지는 않으므로, 실행까지 동시에 하기 위해서 ts-node 사용)

- npm I -g ts-node

  Comments,     Trackbacks