Typescript๋?
Typescript? ๐
-
MS์ ์ํด ๊ฐ๋ฐ/๊ด๋ฆฌ๋๊ณ ์๋ ์คํ์์ค ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ด๋ค.
-
๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ด๋ ต๊ณ ๋ถํธํ๋ค๋ ๋ถ๋ง์ ๋์ํ๊ธฐ ์ํด ๊ฐ๋ฐ๋์๋ค.
-
TypeScript๋ ES5์ Superset์ด๋ฏ๋ก ๊ธฐ์กด์ ์๋ฐ์คํฌ๋ฆฝํธ(ES5) ๋ฌธ๋ฒ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค.
-
ES6์ ์๋ก์ด ๊ธฐ๋ฅ๋ค์ ์ฌ์ฉํ๊ธฐ ์ํด Babel๊ณผ ๊ฐ์ ๋ณ๋ ํธ๋์คํ์ผ๋ฌ(Transpiler)๋ฅผ ์ฌ์ฉํ์ง ์์๋ ES6์ ์๋ก์ด ๊ธฐ๋ฅ์ ๊ธฐ์กด์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง(ํ์ฌ์ ๋ธ๋ผ์ฐ์ ๋๋ Node.js)์์ ์คํํ ์ ์๋ค.
JS vs TS
-
JS๋ 5 - โ3โ๊ณผ ๊ฐ์ Dynamic Typing์ด ๊ฐ๋ฅํ๋ค.
-
TS๋ ERROR MESSEGE๊ฐ ์ ํํ๋ค.
์ค์น
- nodejs ์ค์น
- npm install typescript
- tsconfig.json ํ์ผ ๋ง๋ค๊ธฐ(์ปดํ์ผ์ ์ต์ ์ค์ ํ๊ธฐ ์ํจ)
tsconfig.json
{
"compilerOptions": {
"target": "es5",
"module": "commonjs"
}
}
commonjs๋ require ๋ฌธ๋ฒ
es2015, esnext๋ import ๋ฌธ๋ฒ์ ์ฌ์ฉํจ
- ๋ธ๋ผ์ฐ์ ๋ JS๋ง ์ฝ์ ์ ์๊ธฐ๋๋ฌธ์ TS -> JS๋ก ๋ณํ์์ผ ์ค์ผํจ( ํฐ๋ฏธ๋์
tsc -w
)
๋ฌธ๋ฒ
let a: string = 'kk';
a = 3; // ERROR
'number' ํ์์ 'string' ํ์์ ํ ๋นํ ์ ์์ต๋๋ค.
TS๋ ๋ณ์๋ฅผ ์ ์ธํ ๋ ํ์ ์ ์ง์ ํด์ค๋ค.
์ง์ ํด์คํ์ ์ด ์๋ ๋ค๋ฅธ ํ์ ์ ๋ฃ์ผ๋ฉด ERROR๋ฅผ ๋ฐ์์ํจ๋ค.
(string, number, boolean, null, undefiend, bigint, [], {}, string[], { name? : string } ๋ฑ๋ฑ)
Union Type์ด๋ผ๊ณ ํด์ let a: string[] | number = 123;
์ด๋ฐ์์ผ๋ก ํ์
์ ์ฌ๋ฌ๊ฐ ๋ฐ์์๋์๋ค.
Tuple Type [number, boolean]
type MyType = string[] | { name: string };
let a: MyType = ['abc'];
ํ์ ์ ์ธ์ด ๊ธธ์ด์ง๋ฉด ์์ ๊ฐ์ด ํ์ ์ ๋ณ์์ ๋ฃ์ด์ ์ฌ์ฉํ์ฌ๋ ๋๋ค.( ๋๋ฌธ์๋ก ์ฌ์ฉํ์. )
function abc(x: number): number {
return x * 2;
}
abc('123'); // ERROR
ํจ์์๋ ํ์ ์ ์ธ์ ํด์ค ์ ์๋ค.
arg๋ฅผ ์ซ์ํ์ ์ผ๋ก ์ง์ ํด๋์๊ณ , return ๋ถ๋ถ๋ ์ซ์ํ์ ์ผ๋ก ์ ์ธํด์ฃผ์๋ค.
type Member = {
[key: string]: string;
};
let a: Member = { abcdefg: 'asd' };
stringํ์ ์ ๋ชจ๋ ํค๋ ํค๊ฐ์ผ๋ก stringํ์ ์ ๊ฐ์ง๊ฒ ์ ์ธํ ์ ์๋ค.
class User {
name: string;
constructor(name: string) {
this.name = name;
}
}
class๋ฌธ๋ฒ์ ์ด์ง ๋ค๋ฅด๋ค.
tsconfig.json
{
"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๋ฌธ ์ด์ํ๋ฉด ์๋ฌ๋ด๊ธฐ
}
}
์ด๋ฌํ ๊ฒ๋ค์ด ์๋ค~