๐Ÿ“• Language/TypeScript

[TypeScript] ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ(TS) ๊ธฐ์ดˆ

a n u e 2023. 2. 7. 20:26

 

์ƒˆ๋กœ ์˜ฎ๊ธด ํŒ€์—์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์“ด๋‹ค. ์˜ˆ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๋ญ๋“  ๋ฐฐ์›Œ๋‘๋ฉด ์ข‹์œผ๋‹ˆ๊นŒ


 

โ–  ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ(TypeScript)๋ž€?

 ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์—์„œ ๊ฐœ๋ฐœํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์Šˆํผ์…‹(superset) ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด. ์ฆ‰, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ≥ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ(์ดํ•˜ TS)๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ํŠธ๋žœ์Šค ์ปดํŒŒ์ผ๋œ๋‹ค.

 

  1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(์ดํ•˜ JS)๋Š” ๋งค์šฐ ๊ด€๋Œ€ํ•œ ์–ธ์–ด๋‹ค. ์ด์™€ ๋ฐ˜๋Œ€๋กœ TS๋Š” ์–ธ์–ด์— ๋ฏธ๋ฆฌ ํƒ€์ž…์„ ๋ถ€์—ฌํ•˜์—ฌ ์—„๊ฒฉํ•˜๊ฒŒ ๋ณ€์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ปดํŒŒ์ผ ์‹œ, ์—๋Ÿฌ๋ฅผ ์žก๊ธฐ์— ์šฉ์ดํ•˜๋‹ค.

  2. ๋˜ํ•œ ์‹คํ–‰ ์†๋„ ์‹œ ์žฅ์ ์ด ์žˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ์‹œ, ์—๋Ÿฌ๋ฅผ ์ฒดํฌํ•˜๋Š” ๋Œ€์‹  ๊ทธ ์ „์— ์‚ฌ๋žŒ์ด ์ง์ ‘ ์˜ค๋ฅ˜๋ฅผ ์ฒดํฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— JS์— ๋น„ํ•ด ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๋‹ค. 

  3. ์•ˆ์ „ํ•˜๋ฉฐ, ํ˜‘์—…์— ์šฉ์ดํ•˜๋‹ค. ํƒ€์ธ์˜ ์ฝ”๋“œ๋ฅผ ์ฝ์—ˆ์„ ๋•Œ์— ํ•œ ๋ˆˆ์— ์–ด๋–ค ํƒ€์ž…์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ.

 

JS๋Š” ๋™์  ์–ธ์–ด, ๋Ÿฐํƒ€์ž„ ์‹œ ์—๋Ÿฌ ๋ฐœ์ƒ

TS๋Š” ์ •์  ์–ธ์–ด, ๋Ÿฐํƒ€์ž„ ์ „ ์—๋Ÿฌ ๋ฐœ์ƒ (๋” ์•ˆ์ „ํ•จ)

 

ํฐ ํ”„๋กœ์ ํŠธ์ผ์ˆ˜๋ก JS์˜ ์ž์œ ๋„๋Š” ๋…์ด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค. 

 

* superset : A B ์ผ ๋•Œ, A๋Š” B์˜ ์Šˆํผ์…‹์ด๋‹ค.

 

Vue์—์„œ๋Š” TS ์‚ฌ์šฉ์„ ์œ„ํ•ด .ts ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (React๋Š” .tsx๋ผ๊ณ  ํ•จ)

์ด .ts ํ™•์žฅ์ž๊ฐ€ .js๋กœ ์ปดํŒŒ์ผ ๋˜๋Š” ๊ฒƒ

 

 


 

โ–  ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํƒ€์ž…

 1. Boolean

let isJoin: boolean;
let isJoin: boolean = true;

 

 2. Number

let num: number;
let integer: number = 10;
let float: number = 3.14;
let nan: number = NaN;

 

3. String

let str: string;
let name: string = 'KIMEUNA'
let name: string = lastName + 'EUNA';
let name: string =`${lastName}EUNA`;

 

4. Array

let colors: String[] = ["Red", "Blue", "Yellow"];
let colors: Array[String] = ["Red", "Blue", "Yellow"];

let num: number[] = [1, 2, 3, 4, 5];
let num: Array<number> = [1, 2, 3, 4, 5];

 

์•„๋ž˜์— ๋‚˜์˜ค๋Š” ์œ ๋‹ˆ์–ธ ํƒ€์ž…(๋‹ค์ค‘ ํƒ€์ž…)์„ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

let arr: (string | number)[] = ['red', 1, 'blue', 2];
let arr: Array<string | number> = ['red', 1, 'blue', 2];

 

๋ฐฐ์—ด์˜ ํƒ€์ž…์„ ๋ฏธ๋ฆฌ ์„ ์–ธ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” any๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

let arr: any[] = [0, {}, [], "red", true];

 

์ธํ„ฐํŽ˜์ด์Šค์™€ ์ปค์Šคํ…€ ํƒ€์ž…๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

interface Userinfo {
  name: string;
  age: number;
  isJoin: boolean;
}

let arr: Userinfo[] = [
  {
    name: "KIMEUNA",
    age: 30,
    isJoin: true,
  },
  {
    name: "RYUHANMIN",
    age: 32,
    isJoin: true,
  },
];

 

์ฝ๊ธฐ์ „์šฉ(!) ๋ฐฐ์—ด๋„ ์žˆ๋‹ค.

let colors: readonly String[] = ["Red", "Blue", "Yellow"];
let colors: ReadonlyArray[String] = ["Red", "Blue", "Yellow"];

 

5. Tuple

 ํŠœํ”Œ ํƒ€์ž…์€ ๋ฐฐ์—ด๊ณผ ์œ ์‚ฌํ•˜๋‚˜, ๊ณ ์ •๋œ ํƒ€์ž… ๋ฟ ์•„๋‹ˆ๋ผ ๊ณ ์ •๋œ ๊ธธ์ด๋„ ํ‘œํ˜„ํ•œ๋‹ค.

let tuple: [string, number]
tuple = ['KIMEUNA', 30];
tuple = [30, 'KIMEUNA'];
let userInfo: [number, string, boolean] = [30, 'kimeuna', true];
let userInfo: [number, string, boolean][];
let userInfo: Array<[number, string, boolean]>
usersA = [[30, 'kimeuna', true], [33, 'ryuhanmin', false]];

๊ฐ’์œผ๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ

let userInfo: [1, string, true];

๊ณ ์ •๋œ ๊ธธ์ด๋ผ๊ณ ๋Š” ํ•˜๋‚˜, push / splice ํ•จ์ˆ˜๋กœ ๊ฐ’์„ ๋„ฃ๋Š” ํ–‰์œ„๋Š” ๊ฐ€๋Šฅํ•˜๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฝ๊ธฐ ์ „์šฉ๋„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

let arr: readonly [string, number] = ['kimeuna', 30];
a[0] = 'ryuhanmin'; //Error

6. Enum

 ์ˆซ์ž ํ˜น์€ ๋ฌธ์ž์—ด ๊ฐ’ ์ง‘ํ•ฉ์— ์ด๋ฆ„์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ’์˜ ์ข…๋ฅ˜๊ฐ€ ์ผ์ • ๋ฒ”์œ„๋กœ ์ง€์ •๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ ์“ฐ๊ธฐ ์ข‹๋‹ค(์š”์ผ ๋“ฑ)

 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ณ  1์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค.

enum Week {
  Sun,
  Mon,
  Tue,
  Wed,
  Thu,
  Fri,
  Sat
}
console.log(Week.Mon);
console.log(Week.Tue);

์ค‘๊ฐ„์— ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ์ง€์ •๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

enum Week {
  Sun,
  Mon=7,
  Tue,
  Wed,
  Thu,
  Fri,
  Sat
}

console.log(Week.Mon); // 7
console.log(Week.Tue); // 8

์—ญ๋ฐฉํ–ฅ ๋งคํ•‘์„ ์ง€์›ํ•œ๋‹ค.

console.log(Week['Mon']); // 1
console.log(Week[1]); // 'Mon'

 

7. any

 ๋ชจ๋“  ํƒ€์ž…์„ ์˜๋ฏธํ•œ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

์™ธ๋ถ€ ์ž์›์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ, ํƒ€์ž…์„ ๋‹จ์–ธํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์œ ์šฉํ•˜๋‹ค.

let any: nay = 123;
any = {};
any = null;
any = 'kimeuna'

const arr: any[] = [30, 'kimeuna', true];

 

8. Unknown

 any์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•Œ ์ˆ˜ ์—†๋Š” ํƒ€์ž…์„ ์˜๋ฏธํ•œ๋‹ค. unknow ํƒ€์ž…์€ any๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ํƒ€์ž…์— ํ• ๋‹นํ•  ์ˆ˜ ์—†๋‹ค. 

let u: unknown = 19940207;
let ea1: number = u; //unknown์€ any๋ฅผ ์ œ์™ธํ•˜๊ณ , ๋‹ค๋ฅธ ํƒ€์ž…์— ํ• ๋‹น ๋ถˆ๊ฐ€
let ea2: number = u as number; //ํƒ€์ž… ๋‹จ์–ธ ํ›„์—๋Š” ๊ฐ€๋Šฅ!
let ea3: any = u; // any์™€ unknown์€ ์„œ๋กœ ํ• ๋‹น ๊ฐ€๋Šฅ

 

9. Object

let obj: object = {};
let arr: object = [];
let fun: object = function () {};
let nullVal: object = null;
let date: object = new Date();

* ์ปดํŒŒ์ผ๋Ÿฌ strict ์˜ต์…˜์„ true๋กœ ์„ค์ •ํ•˜๋ฉด null ์„ ๋Œ€์ž… ์‹œ, Error ๋ฐœ์ƒ!

 

์ด๋Ÿฐ์‹์œผ๋กœ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ํƒ€์ž…์„ ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

let userInfo: {name: string, age: number } = {
  name: 'kimeuna',
  age: false, // Error
  email: 'nv@naver.com' // Error
}

 

๋ฐ˜๋ณต์ ์ธ ํ”„๋กœํผํ‹ฐ ํƒ€์ž… ์ง€์ •์„ ์œ„ํ•˜์—ฌ์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํŽธํ•˜๋‹ค.

interface UserInfo {
  name: string,
  age: number
}

let userA: UserInfo = {
  name: 'KIMEUNA',
  age: 30
};

let userB: UserInfo = {
  name: 'RYUHANMIN',
  age: 33,
  mail: true // Error
}

 

10. Null & Undefined

 null๊ณผ undefined๋Š” ๋ชจ๋“  ํƒ€์ž…์˜ ํ•˜์œ„ ํƒ€์ž…์ด๋ฏ€๋กœ, ๊ฐ ํƒ€์ž…์— ๋ชจ๋‘ ํ• ๋‹น ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฌผ๋ก  ์„œ๋กœ์—๊ฒŒ๋„.

 ๋‹จ, stringNummCheck ์˜ต์…˜์„ true๋กœ ์ฃผ๋ฉด ๋‘ ํƒ€์ž…์€ ์„œ๋กœ ํ• ๋‹น์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค.

 

 

11. void

 ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ

const test(logs: string): void {
  console.log('์ง‘์—๊ฐ€๊ณ ์‹ถ๋‹ค.');
}

 

12. Never

์ ˆ๋Œ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค. ์–ด๋– ํ•œ ํƒ€์ž…๋„ ์ ์šฉ ๋ถˆ๊ฐ€ํ•˜๋‹ค.

const err(msg: string) never {
  console.log('error');
}

์•„๋ž˜์™€ ๊ฐ™์ด ๋นˆ ๋ฐฐ์—ด์„ never ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•˜๊ณ , ๊ฐ’์„ pushํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

const never: [] = [];
never.push(27);

 

13. Union

 ๋‹ค์ค‘ ํƒ€์ž…์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์œ ๋‹ˆ์–ธ์„ ์‚ฌ์šฉํ•œ๋‹ค. 

 ํƒ€์ž…์˜ ๊ตฌ๋ถ„ ๊ฐ’์€ | ์ด๋‹ค. () ์€ ์„ ํƒ.

 

 ๊ผญ string, number ๋‘ ํƒ€์ž…์˜ ๊ฐ’์„ ๋ชจ๋‘ ๋„ฃ์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ํƒ€์ž…๋งŒ ์กด์žฌํ•˜๋ฉด ๋œ๋‹ค.

let union: (string | number);
union = 'KIMEUNA'; 
union = 30;
union = false; //Error

 

14. Intersection

 ์ธํ„ฐ์„น์…˜์€ & ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์ค‘ ํƒ€์ž…์„ ์กฐํ•ฉํ•œ๋‹ค. ์ž์ฃผ ์‚ฌ์šฉ์€ X

 

15. Function

 ํ•จ์ˆ˜์—๋„ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ํƒ€์ž… ์ง€์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ธ์ˆ˜์˜ ํƒ€์ž…๊ณผ ๋ฆฌํ„ด ๊ฐ’์˜ ํƒ€์ž…์„ ์ž…๋ ฅํ•œ๋‹ค.

let func: (arg1: number, arg2: number) => number;
myFunc = function(x, y) {
  return x + y;
}
myFunc(10, 100) // 110

let func2: () => void;
func2 = function () {
  console.log('kimeuna');
};

 

 

ํ•œ๋ˆˆ์— ๋ณด๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ(updated)

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” Microsoft์—์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ์œ ์ง€/๊ด€๋ฆฌํ•˜๋Š” Apache ๋ผ์ด์„ผ์Šค๊ฐ€ ๋ถ€์—ฌ๋œ ์˜คํ”ˆ ์†Œ์Šค๋กœ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ๊ฐ•ํ•œ ํƒ€์ž… ์‹œ์Šคํ…œ์„ ์ ์šฉํ•ด ๋Œ€๋ถ€๋ถ„์˜ ์—๋Ÿฌ๋ฅผ ์ปดํŒŒ์ผ ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๋™์•ˆ

heropy.blog