타입스크립트는 별도의 새로운 언어가 아니라, 자바스크립트에 타입(type)을 추가한 확장 언어입니다. 새로 배우는 언어가 아니기 때문에 학습 난이도는 높지 않은 편이며, 처음에는 복잡해보이지만, 나중에 가도 복잡합니다.. (쉽게 쉽게 할거면 자바스크립트 쓰자.. 😉)
타입스크립트로 작성된 코드를 실행하려면 타입스크립트 코드를 자바스크립트 코드로 ‘변환’해주는 작업이 필요합니다. 이러한 변환 작업을 전문 용어로 ‘컴파일(compile)’이라고 합니다. 컴파일을 하기 위해서 여러가지 방법이 있지만, 저희는 Node.js를 이용하는 방법으로 합니다.
실습에 사용할 폴더를 하나 생성하여 비주얼 스튜디오 코드로 열어줍니다.
비주얼 스튜디오 코드의 가장 루트 폴더 경로 내에서 아래와 같이 npm 패키지 초기화를 진행합니다.
npm init -y // 기본 값으로 npm 초기화
npm install typescript --save-dev // 개발모드로 설치
node ./node_modules/typescript/bin/tsc --init # 타입스크립트 초기화
이제 아래와 같은 명령어로 타입스크립트 파일을 자바스크립트로 변환할 수 있습니다.
node ./node_modules/typescript/bin/tsc index.ts
index.ts
function sum(a: number, b: number) {
return a + b;
}
const a = sum(10, 20);
console.log(a);
변환
node ./node_modules/typescript/bin/tsc index.ts
index.js
function sum(a, b) {
return a + b;
}
var a = sum(10, 20);
console.log(a);
{
"compilerOptions": {
// 컴파일된 JavaScript 코드가 호환될 ECMAScript의 버전을 지정합니다.
// 여기서는 ECMAScript 2016 (ES7) 버전으로 컴파일됩니다.
"target": "es2016",
// 모듈 시스템을 지정합니다. CommonJS 모듈 시스템은 Node.js에서 사용되는 표준입니다.
// 컴파일된 코드는 CommonJS 모듈 형식을 따릅니다.
"module": "commonjs",
// 컴파일된 JavaScript 파일이 출력될 디렉토리를 지정합니다.
// 여기서는 `./dist` 디렉토리에 컴파일된 파일이 저장됩니다.
"outDir": "./dist",
// CommonJS 모듈을 ES6 모듈처럼 사용할 수 있도록 추가적인 코드 변환을 수행합니다.
// 주로 `import` 구문을 사용할 때 유용합니다.
"esModuleInterop": true,
// 파일 이름의 대소문자 일관성을 강제합니다.
// 파일을 불러올 때 대소문자가 일치하지 않으면 오류를 발생시킵니다.
// 이는 특히 대소문자를 구분하는 파일 시스템에서 유용합니다.
"forceConsistentCasingInFileNames": true,
// 엄격한 타입 검사를 활성화합니다.
// 여러 가지 타입 검사 옵션을 포함하여 더욱 엄격한 타입 체크를 수행합니다.
"strict": true,
// .d.ts 파일의 타입 검사를 건너뜁니다.
// 이는 컴파일 속도를 높이기 위해 유용합니다.
"skipLibCheck": true
},
// 컴파일 대상 파일을 지정합니다.
// 여기서는 `src` 디렉토리 아래의 모든 `.ts` 파일을 포함합니다.
"include": ["src/**/*.ts"],
// 컴파일에서 제외할 파일을 지정합니다.
// 여기서는 `node_modules` 디렉토리를 제외합니다.
"exclude": ["node_modules"]
}
> npm i typescript
> npx tsc -v # 버전 확인
> npm i ts-node
> npx ts-node -v # 버전 확인
# setting
# code-runner.excutorMap 추가
"code-runner.clearPreviousOutput": true,
**"code-runner.executorMap": {
"typescript": "node_modules/.bin/ts-node"
},**
코드 저장 후 실행해보면 Code Runner로 구동 가능합니다.
타입스크립트
는 정적 언어.ts
→ 컴파일러
→ .js
변환하는 것을 컴파일
이라고 함컴파일러
라고 한다. tsc 도구
컴파일
단계에서 모든 게 결정컴파일
과정에서 오류가 있는지 없는지 검사 가능타입스크립트
= 자바스크립트
+ 타입시스템
npx (node package excutor)
: npm 실행npx ts -node
실행하면 ts -node
를 알아서 실행해준다npx tsc
는 전체 문서를 컴파일npx src/경로/파일명
해당 파일만 컴파일중괄호 {}
안에 하면 된다string
(타입)백틱(``)
, 큰 따옴표("")
, 작은 따옴표('')
로 둘러싸인 문자열은 모두 // ex)
let str: string = "Hello, Typescript!";
// console.log(str);
let emoji: string = "❤️";
// 이모티콘도 유니코드로 작성되어 있으므로 가능함
// console.log(emoji);
// console.log(str.length);
// console.log(str[0]);
let mergeStr = str + emoji;
// console.log(mergeStr);
// console.log(emoji.length);
number
(타입) // ex)
let x: number = 10; // 정수
let y: number = 3.14; // 소수점
let z: number = -100; // 음수
let a: number = NaN; // Not a Number
let b: number = Infinity; // 무한대
let result: number = 0 / 0; // NaN
let positiveInfinity: number = 1 / 0; // Infinity
let negativeInfinity: number = -1 / 0; // -Infinity
let pi: number = Math.PI;
let sqrt: number = Math.sqrt(16);
let random: number = Math.random();
boolean
(타입)true
, false
결과값을 가질 때 사용 // ex)
let isActive: boolean = true;
let isCompleted: boolean = false;
let isBigger: boolean = 10 > 20;
let boolTrue: string = "true";
let boolTrue2: boolean = "true"; // error 발생
let boolTrue3: boolean = JSON.parse("true"); // true
let boolFalse: boolean = JSON.parse("false"); // false
// 0, "", NaN
// falsy로 평가되는 값
let isZero: boolean = !!0;
let empty = "";
let isEmpty: boolean = !!empty;
let isNanValue: boolean = !!NaN;
object
(타입) // ex)
let userObj: object = { name: "철수", age: 10 };
let emptyObj: object = {}; // 빈 객체도 객체
let emptyArr: object = []; // 빈 배열도 객체
let emptyFunc: object = function () {}; // 함수도 객체
console.log(userObj.name); // object 형식에 name 속성이 없습니다
// 속성에 타입을 넣어줘야 error가 안 생김
let userObj2: { name: string; age: number } = {
// name: string, age: number도 가능 콤마도 가능 세미콜론도 가능
name: "철수",
age: 10,
};
console.log(userObj2.name); // 철수
array
(타입)array
를 작성하는 것이 아니라 대괄호 []
를 넣어줘야 한다.// ex)
const emptyArr: [] = []; // 최신 버전
const emptyArrOther: Array<[]> = []; // 옛날 버전
const numArr: [] = [1, 2, 3];
// error, [] 앞에 어떤 타입의 배열인지 적어줘야 함
const numArr2: number[] = [1, 2, 3];
const numArr3: Array<number> = [1, 2, 3]; // 옛날 버전
const stringArr: string[] = ["a", "b", "c"];
const stringArr2: Array<string> = ["a", "b", "c"];
const fruits: string[] = new Array("apple", "banana", "mango");
const fruitsOther: Array<string> = new Array("apple", "banana", "mango");
// 중첩된 배열
const nestedArray: number[][] = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
const nestedArrayOther: Array<Array<number>> = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
const mixArr: [number, string, {}, number[]] = [1, "a", {}, [1, 2, 3]];
튜플
// ex)
const misArrOther: [number, string] = [1, "a"];
const user: [string, number] = ["john", 25];
const emptyErr: [] = [];
// 인덱스의 타입을 지정할 것이 없으므로 이것 또한 튜플
emptyErr.push(10); // 바로 error가 남.
// emptyErr는 아무 타입도 지정되어 있지 않으므로
const emptyErr: number[] = [] // 이렇게 작성 해야 error가 안 남
// 같은 타입에 해당하는 값을 넣는 것은 가능하지만
// 타입이 다른 값을 넣는 것은 불가능
let arr: [number, string] = [1, "a"];
arr[0] = 2;
// arr[1] = 1; // error
console.log(arr); // [ 2, 'a' ]
// 옵셔널 요소 `?`
// 초기값이 없어도 상관 없음
let user2: [string, number, string?] = ["john", 25];
user.push("male");
// user.push(10); // 여기서는 error가 나지 않아도 로직에서 error날 것
let [item, ...rest]: [string, ...number] = ["item1", 1, 2, 3, 4];
// ... 전개 연산자로 나머지 타입을 모두 지정 가능
null
, undefined
(타입)undefined
// ex)
let x: null = null;
// null 병합 연산자 `??`
// 앞의 값이 null이면 뒤의 값을 할당
let c = x ?? "test";
let b: undefined = undefined;
any
(타입) // ex)
let value: any = 10;
value = "a";
value = [];
value = {};
value = function () {};
let arr: any = [1, 2];
console.log(arr[0], arr[1]);
unknown
(타입) // ex)
let value: unknown = [1, 2];
// value = "str";
// value = [];
// value = function () {};
// value = {};
console.log(value[0]);
// 타입이 뭔지 모르는데 배열처럼 꺼내 쓰려고 하니까 error가 난다
// 반대로 any였으면 출력 가능
// value라는 변수가 배열이라는 것을 알려줘야 함
// 사전에 타입을 검사해준다
if (Array.isArray(value)) {
console.log(value[0]);
}
1차 팀 프로젝트가 끝나고 체력이 많이 떨어졌다.
그래도 오늘은 비교적 쉬운 내용을 배워서 집중력을 놓치지 않고 끝까지 공부할 수 있었다.
처음으로 연습문제를 모두 풀어서 제출한 아주 뿌듯한 날이다.
너무 지쳐서 오늘은 여기까지..