๐คTYPESCRIPT ?
- TypeScript JavaScript์ superset์ด๋ค.
* ์ฆ JavaScript๋ผ๋ ์ธ์ด ์์์ ๋์ํ๋ ์ธ์ด๋ผ๋ ์๋ฏธ์ด๋ค.
- JavaScript + @(=type์ง์ )
- JavaScript ํ์
์ด ๋์จํ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ TypeScript๋ฅผ ์ฌ์ฉํด
๋ช
ํํ ํ์
์ ์ง์ ํด์ค์ผ๋ก์จ ๊ฐ๋ฐ์๋ค์ด ํ๋ ์ค์๋ค์ ์ค์ฌ์ฃผ๊ณ ์ข ๋ ์ข์ ์ฝ๋๋ฅผ ์งค ์ ์๊ฒ ๋์์ค๋ค.
๐ฝBasic Type
Boolean
Number
String
let isDone: boolean = false;
let decimal: number = 6;
let fullName: string = `Bob Bobbington`;
Array
- ๊ฐ ํ์
์ []๋ฅผ ๋ถ์ฌ ํด๋น ํ์
์ ๋ฐฐ์ด์ ๋ํ๋ด๊ธฐ
- ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด ํ์
Array์ ์ฌ์ฉํฉ๋๋ค.
- ์ ๋์ธ ํ์
(๋ค์ค ํ์
)์ โ๋ฌธ์์ด๊ณผ ์ซ์๋ฅผ ๋์์ ๊ฐ์ง๋ ๋ฐฐ์ดโ๋ ์ ์ธํ ์ ์๋ค.
- ๋ฐฐ์ด์ด ๊ฐ์ง๋ ํญ๋ชฉ์ ๊ฐ์ ๋จ์ธํ ์ ์๋ค๋ฉด any๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
let list: number[] = [1, 2, 3];
let list: Array<number> = [1, 2, 3];
let array: (string | number)[] = ['Apple', 1, 2, 'Banana', 'Mango', 3];
let array: Array<string | number> = ['Apple', 1, 2, 'Banana', 'Mango', 3];
let someArr: any[] = [0, 1, {}, [], 'str', false];
Tuple
- ํํ ํ์
์ ์ฌ์ฉํ๋ฉด ๊ณ ์ ๋ ์์ ์์ ํ์
์ ์๊ณ ์์ง๋ง, ๊ฐ์ ์ข
๋ฅ๊ฐ ๋ค๋ฅธ ๋ฐฐ์ด์ ํํํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ๋ฌธ์์ด๊ณผ ์ซ์์ ์์ ์๋์ ๊ฐ์ด ํํํ ์ ์๋ค.
let x: [string, number];
x = ["hello", 10];
x = [10, "hello"];
Enum
- enum์ ์ซ์๊ฐ ๋ฐ์ดํฐ ์
์ ์ฌ๋์ด ๋ ์น์ํ ์ด๋ฆ์ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก enum์ 0๋ถํฐ ์์ํ์ฌ 1์ฉ ์ฆ๊ฐ ๋ฉค๋ฒ์ ๋ฒํธ ๋งค๊ธฐ๊ธฐ๋ฅผ ์์ํ๋ค. ๋ฉค๋ฒ ์ค ํ๋์ ๊ฐ์ ์๋์ผ๋ก ์ค์ ํ์ฌ ๋ณ๊ฒฝํ ์ ์๋ค. ์๋ฅผ ๋ค์ด ์ด์ ์์ ๋ฅผ 0 ๋์ 1๋ก ์์๊ฐ๋ฅ.
- ๋๋ enum์ ๋ชจ๋ ๊ฐ์ ์๋์ผ๋ก ์ค์ ํ ์ ์๋ค.
- enum์ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ ์ซ์ ๊ฐ์์ enum์ ๊ฐ ์ด๋ฆ์ผ๋ก ์ด๋ํ ์ ์๋ค๋ ๊ฒ ์ด๋ค. ์๋ฅผ ๋ค์ด ๊ฐ์ด 2์ด์ง๋ง ์์ ์์ enum์ ๋งคํ๋ ๊ฒ์ด ํ์คํ์ง ์์ ๊ฒฝ์ฐ ํด๋น ์ด๋ฆ์ ์ฐพ์ ์ ์๋ค.
enum Color {Red, Green, Blue}
let c: Color = Color.Green;
enum Color {Red = 1, Green, Blue}
let c: Color = Color.Green;
enum Color {Red = 1, Green = 2, Blue = 4}
let c: Color = Color.Green;
enum Color {Red = 1, Green, Blue}
let colorName: string = Color[2];
alert(colorName);
Any(๋ชจ๋ ํ์
)
- ๊ฐ์ ์์ ๋๋ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋์ ์ฝํ
์ธ ์์ ๊ฐ์ ธ์ค๋ ๊ฒ๊ณผ ๊ฐ์ด ํ๋ก๊ทธ๋จ์ ์์ฑํ ๋ ์์ง ๋ชปํ๋ ๋ณ์ ์ ํ์ ์ค๋ช
ํด์ผ ํ ์๋ ์๋ค. ์ด ๊ฒฝ์ฐ ์ปดํ์ผ์ ํ์
๊ฒ์ฌ๋ฅผ ํ์ง ์๊ณ ์ง๋๊ฐ๋๋ก ํด์ผ ํ ๋๊ฐ ์๋๋ฐ. ์ด๋ฐ ๋ฐฉ๋ฒ์ ์ํด any ํ์
์ ์ฌ์ฉํ๋ค.
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false;
Void
- void๋ ํ์
์ด ์ ํ ์๋ค๋ ๊ฒ์์ any์ ๋ฐ๋ ์๋ฏธ์ ๋น์ทํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ ๋ฐํํ์ง ์๋ ํจ์์ ๋ฐํ ์ ํ์ผ๋ก ์ด ํ์
์ ์ฌ์ฉํ๋ค.
- ํ์ง๋ง void ํ์
์ ๋ณ์ ์ ์ธ์ undefined ๋๋null ๋ง ํ ๋นํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ค์ง ์ ์ฉํ์ง ์๋ค.
function warnUser(): void {
alert("This is my warning message");
}
let unusable: void = undefined;
Null ๊ณผ Undefined
- TypeScript์์ undefined์ null์ ์ค์ ๋ก ๊ฐ๊ฐ undefined์ null์ด๋ผ๋ ์ด๋ฆ์ ํ์
์ ๊ฐ์ง๊ณ ์์ต๋๋ค. void์ ๋งค์ฐ ๋น์ทํ๊ฒ, ์ด ํ์
๋ค์ ๊ทธ ์์ฒด๋ก ๋งค์ฐ ์ ์ฉํ์ง๋ ์๋ค.
let u: undefined = undefined;
let n: null = null;
๊ฐ์ฒด: Object
- ๊ธฐ๋ณธ์ ์ผ๋ก typeof ์ฐ์ฐ์๊ฐ "object"๋ก ๋ฐํํ๋ ๋ชจ๋ ํ์
์ ๋ํ๋ธ๋ค.
- ์ฌ๋ฌ ํ์
์ ์์ ํ์
์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋ค์ง ์ ์ฉํ์ง ์๋ค.
๋ณด๋ค ์ ํํ๊ฒ ํ์
์ง์ ์ ํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ฒด ์์ฑ(Properties)๋ค์ ๋ํ ํ์
์ ๊ฐ๋ณ์ ์ผ๋ก ์ง์ ํ ์ ์๋ค.
let obj: object = {};
let arr: object = [];
let func: object = function () {};
let nullValue: object = null;
let date: object = new Date();
let userA: { name: string, age: number } = {
name: 'HEROPY',
age: 123
};
let userB: { name: string, age: number } = {
name: 'HEROPY',
age: false,
email: 'thesecon@gmail.com'
};
- ๋ฐ๋ณต์ ์ธ ์ฌ์ฉ์ ์ํ๋ ๊ฒฝ์ฐ, interface๋ type์ ์ฌ์ฉํ๋ ๊ฒ์ ์ถ์ฒํ๋ค.
interface IUser {
name: string,
age: number
}
let userA: IUser = {
name: 'HEROPY',
age: 123
};
let userB: IUser = {
name: 'HEROPY',
age: false,
email: 'thesecon@gmail.com'
};
interface
- ์ธํฐํ์ด์ค(Interface)๋ ํ์
์คํฌ๋ฆฝํธ ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ์ ์ํ๋ ์ผ์ข
์ ๊ท์น์ด๋ฉฐ ๊ตฌ์กฐ์ด๋ค.
๋ค์๊ณผ ๊ฐ์ด interface ํค์๋์ ํจ๊ป ์ฌ์ฉํ๋ค.
- ๋ค์๊ณผ ๊ฐ์ด ์์ฑ์ ?๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ์ ์์ฑ์ผ๋ก ์ ์ํ ์ ์์ต๋๋ค.
interface IUser {
name: string,
age: number,
isAdult?: boolean
}
let user1: IUser = {
name: 'Neo',
age: 123,
isAdult: true
};
let user2: IUser = {
name: 'Evan',
age: 456
};
Never
- Never์ ์ ๋ ๋ฐ์ํ์ง ์์ ๊ฐ์ ๋ํ๋ด๋ฉฐ, ์ด๋ ํ ํ์
๋ ์ ์ฉํ ์ ์๋ค.
- ๋ณดํต ๋ค์๊ณผ ๊ฐ์ด ๋น ๋ฐฐ์ด์ ํ์
์ผ๋ก ์๋ชป ์ ์ธํ ๊ฒฝ์ฐ, Never๋ฅผ ๋ณผ ์ ์๋ค.
function error(message: string): never {
throw new Error(message);
}
const never: [] = [];
never.push(3);
์ ๋์ธ(Union)
- 2๊ฐ ์ด์์ ํ์
์ ํ์ฉํ๋ ๊ฒฝ์ฐ, ์ด๋ฅผ ์ ๋์ธ(Union)์ด๋ผ๊ณ ํ๋ค.
|(vertical bar)๋ฅผ ํตํด ํ์
์ ๊ตฌ๋ถํ๋ฉฐ, ()๋ ์ ํ ์ฌํญ์ด๋ค.
let union: (string | number);
union = 'Hello type!';
union = 123;
union = false;
๐ทReact ๐ค๐ป TypeScript
ํ
์คํธ (ํ๊ฒฝ) ์
ํ
- npx create-react-app typescript-react-demo --typescript ๋ก ์ค์นํ๋ฉด ํธ๋ฆฌํ๊ฒ React ๐ค๐ป TypeScript ํจ๊ป ์ฌ์ฉ๊ฐ
* npx : create-react-app์ ์คํ์ํค๋ command.
- jsx๋์ tsx๋ก ์
ํ
๋์ด์๊ณ tsconfig.json์ด ์์ฑ๋ ๊ตฌ์กฐ์ ํด๋๊ฐ ์
ํ
๋๋ค.
tsconfig rules
- tsconfig์๋ ๋ช๊ฐ์ง ๊ท์น์ด ์๋ค.
- ์ด๋ฌํ ๊ท์น๋ค์ typescript๊ฐ ์ผ๋ง๋ strictํ ์ง ์
ํ
ํด์ค ์ ์๋ค.
- ์๋ฅผ๋ค์ด allowSyntheticDefaultImports : false
- syntetic import๋ฅผ ํ์ฉํด์ฃผ์ง ์๋๋ค.
- noImplicitAny : false
- any type์ ํํ์๊ณผ ์ ์ธ๋ฌธ์ ๋ํ ๊ฒฝ๊ณ ๋ฅผ ์ค๋ค.
- ์ฆ ํ์
์ ์ฐ์ง ์์๋ ์๋ฌ๊ฐ ๋์ง ์๋๋ค. ์ด rule์ false๋ก ์ฃผ์ง ์๊ณ ํ์
์ ์ง์ ํ์ง ์๋๋ค๋ฉด ์๋ฌ๊ฐ ๋๊ณ ๋ฉ์ถ๊ฒ ๋๋ค.
definitely typed ์ฌ์ฉ
definitely typed ํ์ฉํด์ Styled-Components์ฌ์ฉํ๊ธฐ
- Styled-Components์ ๋ํด์ typescript๋ styled๊ฐ ์ด๋ค ํ์
์ธ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ definitely typed์ ์๋ Styled-Components type์ installํด์ฃผ๋ฉด ๋๋ค.
- npm install @types/styled-components (=์ด์ typeScript๋ styled-components์ ๋ชจ๋ ํ์
์ ์๊ณ ์๋ ์ํ๊ฐ ๋จ)
- definitely typed (github repo)๋ npm js์ ์ํ ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ๋ค์ด์๋ ๋๋ ํ ๋ฆฌ์ด๋ค.
- ์ฌ๊ธฐ์๋ ์๋ง์ type๊ณผ interface๋ค์ด ์๋ค.
- https://github.com/DefinitelyTyped/DefinitelyTyped
์ฆ typescript + react์ฌ์ฉํ๋ฉฐ ์ ๋ช
ํ library๋ฅผ ์ฌ์ฉํ๋ ค ํ๋ค๋ฉด @types/[library]๋ฅผ ์ค์น typescript๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์
์ ์ ์ ์๋ค.
์ฌ์ฉํ๋ ค๋ library๊ฐ @types๊ฐ ์๋ค๋ฉด?
- tsconfig.json์์ "noImplicitAny": false ๋ฅผ ์ค์ ํด์ฃผ์.
- type์ ๋ชป์ฐพ์๋ค๋ ์๋ฏธ์ด๋ค.
- ํ์ง๋ง ๋ณดํต ์ ๋ช
ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ @types๊ฐ ์๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์๋ค.
์ฐธ๊ณ