지속 업데이트 예정
1. TypeScript 구성요소
1.자바스크립트와 타입스크립트 차이**
타입 정의 인터페이스와 클래스 null/undefined-safe Generic(범용 클래스, 메서드 타입 적용) 편집기의 입력 자동 완성 ECMA에 정의되어 있는 자바스크립트의 최신 사양
빌드를 통해 타입스크립트 코드 -> 자바스크립트 코드로 변환
2.타입스크립트 CLI 설치
npm install -g typescript
3.타입스크립트 컴파일(with 엄격한 체크)
tsc –strictNullChecks sayHello.ts
테스트용 REPL 도구 : TS Playground
4. 타입 정의
타입 어노테이션(Type annotation) 변수나 인수명 뒤에 : 타입
5. 변수
var, let, const를 주로 사용 var는 전역 let은 지역 const는 값 재할당 시 오류발생 let,const를 가장 자주 사용
6.원시타입
- number(64비트 부동 소수점)
- string
- boolean
7. 배열
- number 배열 시 number[]
- string 배열 시 string[] 명시
8. 객체
객체는 키와 값을 이용하여 객체 타입 정의 가능
let object : {키명_1: 타입_1; 키명_2: 타입_2;}
모든 속성은 ?을 사용해 옵셔널(Optional) 속성 지정 가능
function printName(obj: {firstName: string; lastName?: string}) {
// …
}
printName({ firstName: ‘Hana’ })
printName({ firstName: ‘Hana’, lastName: ‘Kim’})
둘 다 정상 작동
9.any
모든 타입을 허용 -> any 사용 시 타입 체크 기능 작동X -> any 타입 사용하지 않는 것이 바람직
let user: any = { firstName: ‘Hana’ }
10.함수
함수에선 인수와 반환값의 타입 지정 가능
function(인수_1: 타입_1, 인수_2: 타입_2 ….): 반환값{
//…
}
2.TypeScript 기능
1. 타입 추론
자동적으로 타입이 결정되는 기능(타입 어노테이션 생략하면 적용)
2. 타입 어서션
구체적인 타입을 알 수 없을 경우에는 타입 추론이 제대로 적용하지 않음. 이럴 경우 명시적으로 타입을 지정
변수 = 값 as 타입
const myCanvas = document.getElementBy(‘main_canvas’) as HTMLCanvasElement
하지만 위 같은 방식은 복잡한 어서션을 수행할 때는 잘 표현하기 어려움. 이런 경우에는 2단계 어서션으로 구현 가능
const result = (response as any) as User
단 타입 어서션은 실행 시 에러가 발생할 수 있음
3.타입 앨리어스
타입을 재사용할 경우 사용
type 타입명 = 값
type Point = {
x: number,
y: number
}
3.1 인덱스 타입(키 이름 명시하지 않고 타입 앨리어스 지정가능)
{[] : 타입명 }
type Label = {
[key : string] : string
}
4.인터페이스
인터페이스를 implements 시 모든 변수와 함수의 구현을 강제함(옵셔널 속성 변수는 제외) 인터페이스는 나중에 확장 가능 인터페이스는 extends를 사용해 인터페이스를 다중상속 후 인터페이스 정의 가능
interface Point{
x: number;
y: number;
}
//추가
interface Point{
z?: number;
}
//구현
class MyPoint implements Point{
x: number;
y: number;
}
// 다중 상속 후 새로운 인터페이스 정의
interface Colorful{
color:string;
}
interface Circle{
radius: number;
}
interface ColorfulCircle extends Colorful, Circle {}
const cc: ColorfulCircle = {
color: ‘빨강’,
radius: 19
}
5.클래스
클래스는 extends를 사용해 다른 클래스를 상속 가능 super 함수를 통해 상속원의 생성자를 호출할 수 있음
interface IUser {
name: string;
age: number;
sayHello: () => string //인수없이 문자열을 반환
}
class User implements IUser{
name: string;
age: number;
constructor() {
this.name = ‘’
this.age = 0
}
sayHello() {
return `안녕하세요 저는 ${this.name}이며, ${this.age}살입니다.`
}
}
6. 접근 수정자
- public: 접근 가능
- private: 접근 불가(컴파일 시 오류)
- protected: 상속후 클래스의 하위 객체만 접근 가능
3.실제 개발 시 도움이 되는 타입
1.Enum 타입
열거형, 이름이 붙은 상수 셋을 정의할 수 있음. 비슷한 기능으로는 Union, Union 타입을 선호하는 개발자도 있음
enum Direction {
Up = ‘UP’,
Down = ‘DOWN’,
Left = ‘LEFT’,
Right = ‘RIGHT’
}
const value = ‘DOWN’
// 문자열에서 Enum 타입으로 변환한다
const enumValue = value as Direction
if (enumValue == Direction.Down) {
console.log(‘Down is selected’)
}
2. 제네릭 타입
제네릭은 클래스와 함수에 대해, 그 안에서 사용하는 타입을 추상화하여 외부에 의해 타입을 지정할 수 있는 기능
class Queue<T> {
private array: T[] = []
//T 타입의 값을 배열에 추가
push(item: T){
this.array.push (item)
}
}
3. Union, Intersection 타입
타입을 조합해서 사용할 수 있으며,Union은 합집합, Intersection은 교집합의 타입
function printId(id: number | string){
console.log(id)
}
// number 정상 작동
printID(11)
//string도 정상 작동
printId(‘22’)
4. 리터럴 타입
|로 구분하는 리터럴 타입을 사용하면 정해진 문자열이나 수치만 대입할 수 있는 타입으로 제어 가능
5.never 타입
never타입은 절대로 값이 반환되지 않는 타입을 말함
function error(message: string): never {
throw new Error(message)
}
function foo(x: string | number | number []): boolean {
if (typeof x === ‘string’) {
return true
} else if (typeof x === ‘number’) {
return false
}
return error(‘Never happens’)
}
4.타입스크립트 테크닉
1.옵셔널 체이닝
중첩된 객체의 속성이 존재하는가에 관한 조건 분기를 간단하게 기술 가능 컴파일 후 생성된 자바스크립트에 null 체크 코드를 추가하여 실행 시 에러 발생 x
만약 인터페이스에 game 속성이 있다고 할 때 객체의 game 속성에 대한 null 또는 undefined 조건을 어떻게 체크할 수 있을까?
interface User{
name: string
game?:{
gta4: boolean
totalwar: boolean
}
}
let user: User = {name:’Min’, game: { gta4: true, totalwar: true} }
//game이 존재할 경우 true 출력
console.log(user.game?.gta4)
user = { name: ‘Min’ }
//game이 존재하지 않는 경우에도 에러 발생 x
console.log(user.game?.gta4)
이런 방식을 통해 예외처리 발생문제나 null & undefined 분기 설정 없이 쉽게 조건 분기를 간단하게 작성이 가능하다.
2.논-널 어서션 연산자
컴파일 옵션 -strictNullChecks 옵션으로 컴파일시, 타입스크립트는 null일 가능성이 있는 객체에 대한 접근을 에러로 취급. 논-널 어서션 연산자는 컴파일 에러를 억제 실행 시 에러 발생 여지 있음
function processUser(user?: User) {
let s = user!.name
}
3. 타입 가드
실행 시 에러를 발생시키기 쉬운 as같은 타입 어서션보다 안전하게 코드 작성 가능 if 조건문 이후 변수의 타입을 필터링(아직 좀 모호한 듯…)
4.keyof 연산자
5.인덱스 타입
6.readonly
7.unknown
8.비동기 Async/Await
9.타입 정의 파일
5.타입스크립트 개발 환경
1.tsconfig.json
2.Prettier
3.ESLint
6.컴파일 옵션
1.no lmplicitAny
2.target
+타입 스크립트 컴파일러
- 스캐너: 타입스크립트 소스 코드 기반 토크나이제이션
- 파서: 토큰을 받아 추상구문트리(AST) 변환
- 바인더: AST 기반 타입 체크의 기본이 되는 심벌 작성
- 체커: 타입 체크를 실행(컴파일러에서 가장 큰 부분)
- 이미터: AST와 체커의 결과를 바탕으로 타입스크립트에서 자바스크립트로 변환 후 출력