Overview
기존의 자바스크립트로 만든 프로젝트는 규모가 커지고 코드가 복잡해질수록 디버그와 테스트 단계에 검수 시간이 늘어났었습니다.
이를 극복하고자 나온 자바스크립트 대체 언어 중 하나가 TypeScript(타입스크립트)
입니다.
What is the TypeScript?
타입스크립트는 Microsoft에서 발표한 오픈소스로, JavaScript 프로그래밍 확장(Superset) 언어
정적 타입
- 정적 타입을 지원하여 컴파일 단계에서 오류를 확인 가능합니다
- 명시적인 정적 타입 지정은 개발자의 의도를 명확하게 전달하며, 코드 가독성을 높이고 디버깅을 쉽게 할 수 있도록 도와줍니다.
도구의 지원
- IDE(Integrated Development Environment)와 같은 다양한 도구의 타입 정보를 제공 받아 높은 수준의 코드 어시스트, 타입 체크, 리팩토링 등을 지원받을 수 있으며 이러한 도구의 지원은 대규모 프로젝트를 위한 필수 요소입니다.
강력한 객체지향 프로그래밍 지원
- 인터페이스, 제네릭 등과 같은 객체지향 프로그래밍을 지원하여 크고 복잡한 프로젝트의 코드 기반을 쉽게 구성할 수 있도록 합니다.
ES6 / ES NEXT 지원
- TypeScript를 이용하여 새로운 스펙의 유용한 기능을 안정적으로 도입하기에 유리합니다. (TypeScript가 ECMAScript 표준에는 포함되어 있지 않지만, 표준화가 유력한 스펙을 도입하고 있습니다.)
Requirements
컴파일(Compile) / 트랜스파일(Transpile)
: TypeScript로 작성된 .ts
파일은 컴파일러를 이용해 JavaScript 파일로 변환해주어야 브라우저에서 동작 합니다.
Setup(설치)
NPM을 통한 설치
Yarn을 통한 설치
tsconfig.json 환경설정
- 해당 디렉토리에서 아래 명령어를 실행하면,
tsconfig.json
파일이 자동 생성됩니다.
1 | { |
컴파일 및 실행
- 아래와 같은
sample.ts
파일을 작성 한 후,tsc
명령어를 실행합니다.
1 | const message: string = 'Hello, LunarScents!'; |
- 타입스크립트 CLI를 통해 코드를 컴파일 하기 위해서는 타입스크립트를 전역으로 설치하거나, 또는 아래와 같이 package.json의 build 스크립트를 작성합니다.
1 |
|
Basic Types
JavaScript 에서 지원하는 기본형 타입(Boolean, Number, String, Array, Null, Undefined
)을 지원하며, 추가적으로 지원하는 타입들은 아래와 같습니다.
- 두 가지의 타입은
|
연산자를 사용합니다.
Tuple
- 튜플 타입은 고정된 개수의 요소 타입을 알고 있지만 반드시 같을 필요는 없는 배열을 표현할 수 있도록 합니다.
- 예를 들어, 다음과 같은 string과 number의 쌍으로 값을 나타낼 수 있습니다
1 | // 튜플 타입 선언 |
Enum
- JavaScript의 표준 데이터 타입 집합에 추가할 수 있는 유용하고 부가적인 추가 자료는
enum
입니다. - 멤버 중 하나의 값을 수동으로 설정하여 이를 변경할 수 있거나, 열거 형의 모든 값을 수동으로 설정합니다.(기본적으로 enums는 0부터 시작하는 자신의 멤버 번호를 매기기를 시작합니다.)
- enum의 편리한 기능은 숫자 값에서 enum의 해당 값 이름으로 이동할 수 있다는 것입니다.
1 | enum Color { |
Any
- 코드를 작성할 때 알지 못하는 변수의 타입을 설명해야 할 수도 있습니다.
- 타입 검사를 선택하지 않고 그 값이 컴파일-타임 검사를 통과하도록 하고 싶은 경우,
any
타입으로 지정합니다. - any 타입은 기존 JavaScript로 작업할 수 있는 강력한 방법으로 컴파일 과정에서 타입 검사를 점진적으로 실행 (opt-in) 및 중지(opt-out) 할 수 있습니다.
- 객체와 다른 점은 객체는 객체 타입의 변수를 사용하면 해당 객체에는 값만 할당할 수 있습니다.
1 | let notSure: any = 4; |
Void
void
는any
의 정반대이지만 조금 비슷합니다.- 반환 값을 반환하지 않는 함수의 반환 타입으로 볼 수 있습니다.
void
타입의 변수 선언은undefined
또는null
만 할당할 수 있으므로 유용하지 않습니다.
1 | function warnUser(): void { |
Never
never
타입은 절대로 발생하지 않는 값의 타입을 나타냅니다.- 예를 들어, 함수 표현식의 반환 타입이거나 항상 예외를 던지는 화살표 함수 표현식이거나 절대 반환하지 않는 표현식입니다.
- 변수는 또한
never
일 때 타입 가드에 의해 좁혀지더라도 결코 사실일 수 없으며 타입을 획득하지 못합니다. never
타입은 모든 타입의 서브 타입이며 모든 타입에 할당할 수 있습니다.- 어떤 타입도 never의 서브 타입이거나 할당 가능한 타입은 아닙니다.
any
조차도never
에 할당할 수 없습니다.
1 | // 반환되는 함수에는 연결할 수 없는 end-point가 있어서는 안 됩니다. |
Type assertions
Type assertions
은 컴파일러에게 “나를 믿어, 내가 하고 있는 일을 안다”라고 말하는 방법입니다.Type assertions
은 다른 언어의 형 변환(타입캐스팅)과 비슷하지만 특별한 검사나 데이터를 재구성하지는 않습니다.런타임에 영향을 미치지 않으며 컴파일러에서만 사용됩니다.
TypeScript는 개발자가 필요한 특별한 검사를 수행했다고 가정합니다.
Type assertions은 두 가지 형태를 가집니다.
angle-bracket(꺾쇠괄호)
구문1
2
3let someValue: any = 'this is a string';
let strLength: number = (<string>someValue).length;as
구문TypeScript를 JSX와 함께 사용할 때는 as 스타일의 assertions(단언)만 허용합니다.
1
2
3let someValue: any = 'this is a string';
let strLength: number = (someValue as string).length;
Functions
Interface
Inerface
는 클래스 나 객체를 위한 타입을 지정할 때 사용하는 문법입니다.
Generics
Generics
는 타입스크립트에서 함수, 클래스, interface, type을 사용하게 될 때 여러 종류의 타입에 대하여 호환을 맞춰야 하는 상황에서 사용하는 문법입니다.