2024년 10월 28일
타입스크립트는 왜 필요한가
타입스크립트를 사용하면 좋은점
수업 대상
선행 학습
타입스크립트 = 자바스크립트 + 타입 체크
자바스크립트 vs 타입스크립트
// javascript
function plus(a, b) {
return a + b;
}
console.log(plus('3', '5')); // 35
// typescript
function plus(a : number , b : number) {
return a + b;
}
console.log(plus('3', '5')); // TypeError
데이터 타입을 표기하면 좋은 점
// app.ts
function logName(name : string) {
console.log(name); // hello world
}
logName('hello world');
타입스크립트는 컴파일 단계를 거쳐야 하므로 컴파일 명령어 입력해야함
타입스크립트의 설정 초기값 만들기
코드를 수정하고 싶다면, ts코드를 js코드로 매번 컴파일(tsc app.ts)해줘야함 → 귀찮음
왜 데이터 타입이 그렇게 중요한가
타입 추론(Type Inference) 기능
타입스크립트는 타입 추론 기능을 통해 변수의 타입을 자동으로 판단할 수 있다.
타입스크립트 컴파일러가 초기에 할당된 값을 바탕으로 변수의 타입을 추론한다.
let age = 30;
-> 타입스크립트는 age 변수의 타입을 자동으로 number로 추론한다.
타입 추론은 코드를 간결하게 작성할 수 있도록 도와주지만 타입을 명시적으로 지정하는 것이 더 명확하다.
타입 추론이 모호한 경우나 복잡한 로직에서는 타입을 명시하는 것이 좋다.
타입 추론에 의해서 object 안의 프로퍼티에 맞지 않는 타입을 할당하면 에러를 발생시킨다
타입스크립트에서는 다양한 데이터 타입을 지원
데이터 타입은 크게 기본 데이터 타입, 객체 타입, 특수 타입으로 나눌 수 있음
기본 데이터 타입
객체 타입
특수 타입
타입 명시
변수에 데이터 타입을 지정하는 방법
변수와 함수의 데이터 타입 명시
// app.ts
// 변수의 데이터 타입 명시
let stdId : number = 1111;
let stdName : string = 'lee';
let age : number = 20;
let gender : string = 'male';
let course : string = 'Typescript';
let completed : boolean = false;
// 함수의 데이터 타입 명시(매개변수, 리턴타입)
function Plus(a : number, b : number) : number { // 아무것도 리턴하지 않으면 void
return a + b;
}
// 학생 정보들을 모두 보여주기 위해 위 객체를 리턴해주고 싶다.
// 그런데, 반환 값(리턴값)의 타입이 object 타입이면 너무 추상적이므로,
// 위의 객체 프로퍼티 타입 정보를 그대로 넣어준다.
function getInfo(id : number) : {
stdId : number;
stdName : string;
age : number;
gender : string;
course : string;
completed : boolean;
} {
return null;
}
// 그런데 매번 이렇게 타입을 작성하면 번거롭다.
// app.ts
// 변수의 데이터 타입 명시
let stdId : number = 1111;
let stdName : string = 'lee';
let age : number = 20;
let gender : string = 'male';
let course : string = 'Typescript';
let completed : boolean = false;
interface Student {
stdId : number;
stdName : string;
age : number;
gender : string;
course : string;
completed : boolean;
}
// 1. 데이터타입 get하기
function getInfo(id : number) : Student {
// 반환하는 값을 Student 타입으로 지정했기 때문에, return 뒤에도 Student 타입에 맞춰서 값을 반환시켜야함
return {
stdId : id,
stdName : 'lee',
age: 20,
gender : 'female',
course : 'javascript',
compeleted : true
}
}
console.log(getInfo(5678));
// { stdId : 5678, stdName : 'lee', age : 20, gender : 'female', course : 'javascript', completed: true}
// 2.
// 만약 age를 제외시키면
// 컴파일에 실패하고 에러 발생 -> age 프로퍼티가 리턴값에 포함되지 않아도 에러가 발생한다.
// 실제 리턴되는 값과 맞지 않으므로!
// 그런데, 매번 타입들을 똑같이 맞춰주는 것은 어려움
// 다 맞춰서 리턴하지 않게 하고 싶음 -> 옵션을 줄 수 있음 -> ?를 붙이면 됨 -> 선택적 프로퍼티
/*
interface Student {
stdId : number,
stdName : string,
age? : number,
gender : string,
course : string,
completed : boolean
}
*/
// 3. 함수의 매개변수도 선택적 매개변수로 만들 수 있음
function Plus(a : number, b? : number) : number {
return a + b;
}
// 4. 데이터타입을 set해주기
let std = {
stdId : 910111,
stdName : 'kim',
age: 22,
gender : 'male',
course : 'node.js',
completed : true
}
function setInfo(student : Student) : void {
console.log(std);
}
setInfo(std);
// {stdId: 910111, stdName: 'kim', age: 22, gender: 'male', course: 'node.js', completed: true}
// 5. 메소드도 인터페이스에서 선언할 수 있음 - 2가지 방법 있음_표현방법만 다르고 기능은 같음
interface Student {
stdId : number;
stdName? : string;
age? : number;
gender? : string;
course? : string;
completed? : boolean;
setName(name : string) : void; // 1) 일반함수
// setName : (name : string) => void // 2) 화살표함수
// getName : () => string
}
// 인터페이스는 독립적으로 사용할 수 없고 구현해서 쓸 수 있었음
// A implements B
class MyStudent implements Student {
stdId = 910111;
stdName = 'kim';
age = 22;
gender = 'male';
course = 'node.js';
completed = true;
// 오버라이딩
setName(name : string) : void {
this.stdName = name;
console.log('이름 설정 : ' + this.stdName);
}
}
const myInstance = new MyStudent();
myInstance.setName('엘리스'); // 이름 설정 : 엘리스
인터페이스는 ‘string’이나 ‘number’ 타입처럼 데이터 타입으로 사용 가능
선택적 프로퍼티로 지정하려면 속성값 뒤에 ?를 붙여준다.
메소드도 인터페이스 내에서 선언 가능 → 인터페이스를 상속받는 클래스는 반드시 메소드 오버라이딩 해야함
인터페이스를 클래스에 상속(개념은 extends가 아니라구현(implement)임))할 수 있다.
자바스크립트로 컴파일 되면 인터페이스는 보이지 않는다.
enum
사용자 정의 타입
여러 값들에 미리 이름을 정의하여 열거해두고 사용하는 타입
(사용자별로) 원하는 값을 고정시키고 사용할때 주로 사용
enum을 타입으로 선언해보자
// app.ts
// 열거형 : 사용자 정의 타입
enum GenderType {
Male,
Female
}
// 숫자형 열거형 Male=0, Female=1
// 자동 증가함
// 문자형 열거형 Male='male', Female='female'
// 읽기 쉬운 문자를 줄 수 있음
interface Student {
stdId : number;
stdName : string;
age? : number;
gender? : GenderType.Male;
course? : string;
completed : boolean;
setName(name : string) : void; // 1) 일반함수
// setName? : (name : string) => void // 2) 화살표함수
// getName? : () => string
}
enum 같이 읽으면 좋은 사이트 :
https://velog.io/@ahsy92/TypeScript-Enum%EC%9D%B4%EB%9E%80
🍎🍏 오늘의 느낀점 : 오늘 드디어 타입스크립트에 대해서 배웠다,, 사이드 프로젝트를 하면서 잠깐 건드려봤었는데 사용자정의타입 중(interface, type) 인터페이스에 대해서 알게 되었다. c언어의 인터페이스와 연관지어서 구현할수 있는 타입의 틀(?)과 같은 느낌이었다.