Typescript 필수문법 10분 정리와 설치 셋팅 (Vue, React 포함)
Typescript쓰는 이유
Typescript
= Javascript + Type 문법
"Javascript Superset"
1. JavaScript는 Dynamic Typing 가능
5 - '3'
원래는 숫자 - 숫자만 가능하지만, JS가 알아서 숫자로 바꿔줌. 개꿀 (프로젝트가 크면 단점이 됨)
코드 길게 짤 땐 자유도 & 유연성은 오히려 쓰레기임
TypeScript는 타입을 엄격히 검사해준다.
5 - '3' // TS Error: "문자랑 숫자빼는거 이상한데요, 빨리 수정하셈!"
2. 에러메시지 퀄리티가 오짐
에러메시지가 정확해진다. 자바스크립트 에러는 추상적이고 추적 어려운 에러가 많다.
var counter = 0;
counter = '1'; // Type 'string' is not assignable to type 'number'.
// TS 에러: '멍청아 숫자넣어야지 왜 문자를 넣음'
var obj = {
append: 123,
}
obj.apend; // Property 'apend' does not exist on type '{append: number;}'. Did you mean 'append'?
// TS에러: '토익 300점이냐 apend 아니고 append임'
TypeScript는 그냥 코드 에디터 부가기능 역할로 봐도 된다. 문법이랑 사용법 다 똑같은데 type부분만 잘 지정해주면 된다.
TypeScript 설치하기
1. 일반 HTML CSS JS 웹 개발시 사용하기
static 웹페이지 개발시 사용 방법이다.
- Node.js 최신 버전 설치하기 (아니면 에러남)
- VScode 에디터 준비하기
- 터미널 오픈하기 (ctrl+`)
- <code>npm install -g typescript</code> 입력하기
- 코드 짤 폴더 만들고 에디터로 폴더 오픈하기
- 어쩌고.ts 파일 생성 후 코드 짜기
- tsconfig.json 생성 후 내용 작성
// tsconfig.json
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
}
}
- **target**: 어떤 버전의 자바스크립트로 바꿔줄지 지정
- es5 : 2010년
- es2016, esnext : 최신버전
- **module**: 자바스크립트 파일간 import 문법을 구현할 때 어떤 문법을 쓸지 지정
- commonjs : require 문법
- es2015, esnext : import 문법
- 어느정도 IE 호환성을 원한다면 es5, commonjs가 국룰이다. 그런데 정말 신버전 자바스크립트만 표현가능한 문법들이 있는데 그런 것들은 esnext 버전으로 올려줘야 사용가능하다.
- 추가로 넣을 만한 것들
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"noImplicitAny": true,
"strictNullChecks": true
}
}
- **noImplicitAny** : any라는 타입이 의도치않게 발생한 경우 에러를 띄워주는 설정
- **strictNullChecks** : null, undefined 타입에 이상한 조작을 하면 에러를 띄우는 설정
ts 파일은 브라우저가 못 읽는다. 브라우저는 js 파일만 읽을 수 있기 때문이다. 그래서 당연히 ts 파일을 js로 변환해야한다.
- 터미널 켜서 <code>tsc -w</code>입력한다. (ts 파일을 js 파일로 자동 변환된다)
이렇게 파일을 변환하는걸 **compile(컴파일)한다** 고 하는데 그 옵션들을 tsconfig.json에 기입한다.
2. React, Vue, ... 라이브러리에서 사용하기
이미 있는 React 프로젝트에서 설치하기
작업폴더 경로에서 터미널을 오픈하고
npm install --save typescript @types/node @types/react @types/react-dom @types/jest
를 입력해주면 끝이다. 이제 js 파일을 ts 파일로 바꿔서 이용할 수 있다. 근데 뭔가 많아서 불안정하고 에러도 많이 날 것 같다.. 그래서 근야 애초에 처음부터 Typescript 적용된 React 프로젝트를 생성할 수도 있다.
그냥 React 프로젝트를 새로 만들거면
새로 작업 폴더를 하나 만들고 거기에 에디터와 터미널을 오픈하고
npx create-react-app my-app --template typescript
를 입력해주면 끝이다.
TypeScript 문법 정리
사용 방법
let 이름 :string = 'kim';
'이름' 변수엔 string(문자) type만 들어올 수 있습니다 라는 의미. 이렇게 type을 엄격하게 관리할 수 있다. 이름에 숫자 형태를 넣으려하면 에러가 발생한다.
간단한 변수 타입 지정 가능
- string
- number
- boolean
- null
- undefined
- bigint
- []
- {}
- ... 등
array 타입지정
let 이름 :string[] = ['kim', 'park']
이 변수엔 string 담긴 array만 들어올 수 있습니다 라는 의미.
object 타입지정
let 이름 :{name? : string} = {name: 'kim'};
name 속성은 옵션이고(optional, 안들어와도 에러 안남), name 속성에는 string만 들어올 수 있다는 의미.
다양한 타입이 들어올 수 있게 하려면 Union type
let 이름 :string | number = 'kim';
string 혹은 number 타입만 들어올 수 있음(union type)
타입은 변수에 담아쓸 수 있음, Type alias
type Name = string | number;
let 이름 :Name = 123;
차별화를 주기 위해 주로 **대문자로 시작**한다.
함수에 타입지정 가능
function 함수(x :string) :number {
return x * 2;
}
함수('123'); // 에러
이 함수는 파라미터로 number, return 값으론 number여야 한다는 의미.
array에 쓸 수 있는 tuple 타입
type Member = [number, boolean]; // tuple 타입
let john:Member = []; // 에러
let john:Member = [123, true];
무조건 첫째는 number, 둘째는 boolean여야 한다는 의미
object에 타입지정해야할 속성이 너무 많으면
type Member = {
[key: string]: string
}
let john : Member = { name: 'kim'}
- **[key: string] : string** ➡️ 문자로 된 모든 object 속성 타입은 string여야 한다는 의미. 그리고 그 값(value)도 string여야 함.
class 타입지정 가능
class User {
name :string;
constructor(name :string){
this.name = name;
}
}
실제로 코드를 짜다보면 TypeScript에서 지켜야할 코딩 룰도 있고, 타입문법 외의 기능도 많다. 그래서 실제 코드를 짜보면서 배우자.
tsconfig에 들어갈 기타 항목들
전체는 https://www.typescriptlang.org/tsconfig 에서 구경할 수 있다.
{
"compilerOptions": {
"target": "es5", // 'es3', 'es5', 'es2015', 'es2016', 'es2017','es2018', 'esnext' 가능
"module": "commonjs", //무슨 import 문법 쓸건지 'commonjs', 'amd', 'es2015', 'esnext'
"allowJs": true, // js 파일들 ts에서 import해서 쓸 수 있는지
"checkJs": true, // 일반 js 파일에서도 에러체크 여부
"jsx": "preserve", // tsx 파일을 jsx로 어떻게 컴파일할 것인지 'preserve', 'react-native', 'react'
"declaration": true, //컴파일시 .d.ts 파일도 자동으로 함께생성 (현재쓰는 모든 타입이 정의된 파일)
"outFile": "./", //모든 ts파일을 js파일 하나로 컴파일해줌 (module이 none, amd, system일 때만 가능)
"outDir": "./", //js파일 아웃풋 경로바꾸기
"rootDir": "./", //루트경로 바꾸기 (js 파일 아웃풋 경로에 영향줌)
"removeComments": true, //컴파일시 주석제거
"strict": true, //strict 관련, noimplicit 어쩌구 관련 모드 전부 켜기
"noImplicitAny": true, //any타입 금지 여부
"strictNullChecks": true, //null, undefined 타입에 이상한 짓 할시 에러내기
"strictFunctionTypes": true, //함수파라미터 타입체크 강하게
"strictPropertyInitialization": true, //class constructor 작성시 타입체크 강하게
"noImplicitThis": true, //this 키워드가 any 타입일 경우 에러내기
"alwaysStrict": true, //자바스크립트 "use strict" 모드 켜기
"noUnusedLocals": true, //쓰지않는 지역변수 있으면 에러내기
"noUnusedParameters": true, //쓰지않는 파라미터 있으면 에러내기
"noImplicitReturns": true, //함수에서 return 빼먹으면 에러내기
"noFallthroughCasesInSwitch": true, //switch문 이상하면 에러내기
}
}
'Front-End: Web > TypeScript' 카테고리의 다른 글
[코딩애플] ts part 1-5. Narrowing & Assertion (0) | 2022.10.22 |
---|---|
[코딩애플] ts part 1-4. function parameter & return (0) | 2022.10.22 |
[코딩애플] ts part 1-3. 타입을 미리 정하기 애매할 때(union type, any, unknown) (0) | 2022.10.22 |
[코딩애플] ts part 1-2. primitive types (0) | 2022.10.22 |
[해결] vscode에서 TypeScript 오류가 발생한 곳에 빨간색 밑줄이 안뜬다 (0) | 2022.03.05 |