-
TypeScript ํ์ ์คํฌ๋ฆฝํธ ๊ธฐ์ด -2๐ FrontEnd/TypeScript 2022. 11. 8. 20:33
์์ํ๋ฉด์
ํ์ ์คํฌ๋ฆฝํธ์ ๊ธฐ์ด๋ฅผ ๊ณต๋ถํฉ๋๋ค.
ํด๋์ค ์ ์
- ํด๋์ค๋ implements ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ํด๋์ค๋ ๊ฐ์ฒด์ ๋น์ทํด๋ณด์ด์ง๋ง, ์์์ ํ ์ ์์ต๋๋ค.
// TS interface Car{ color:string; wheels:number; start():void; } // ์์ฑ์(constructor) ๊น์ง๋ control ํ ์ ์๋ค class Bmw implements Car{ // ':' ๋ง๊ณ implements ๋ฅผ ์ฌ์ฉํด์ผํ๋ค color; // TS ์์ ์๋ตํ๊ฒ ๋๋ฉด BMW ์์ color๋ฅผ ์ฐพ์ง ๋ชปํ๋ค. ๋ณ์๋ฅผ ๊ผญ ๋ง๋ค์ด ์ฃผ์ด์ผํ๋ค. wheels=4; // TS ์์ ์๋ตํ๊ฒ ๋๋ฉด wheels๋ฅผ ์ฐพ์ง ๋ชปํ๋ค. BMW class ์ Wheels ๋ณ์๋ฅผ ๋ง๋ค์ด ์ฃผ์ด์ผํ๋ค. constructor(c:string){ this.color=c; } start():void{ console.log('go....!'); } } const car1 = new Bmw('green'); console.log(car1); car1.start();
// JS class Bmw { constructor(c) { // constructor(์์ฑ์ ํจ์)๋ ์ฒ์์ ์๋์ผ๋ก ์์ (๋ฉค๋ฒ ๋ณ์๋ฅผ ์ด๊ธฐํํด์ค๋ค) this.wheels = 4; // ๋ฉค๋ฒ ๋ณ์ this.color = c; } start() { console.log('go....!'); } } const car1 = new Bmw('green'); // car1 ์ ์ธ์คํด์ค console.log(car1); car1.start();
extends (ํ์ฅ)
interface Car{ // ๋ถ๋ชจ ์ธํฐํ์ด์ค color:string; wheels:number; start():void; } interface Car2 extends Car{ // ์์ ์ธํฐํ์ด์ค door:number; stop(d:number):number; } // interface Car2{ // ์์ ์ธํฐํ์ด์ค // color:string; // wheels:number; // door:number; // start():void; // stop():void; // } class Bmw implements Car{ color; wheels=4; constructor(c:string){ this.color=c; } start():void{ console.log('Bmw go....!'); } } const car1 = new Bmw('green'); console.log(car1); car1.start(); class Benz implements Car2{ color='red'; wheels=4; door; constructor(c:number){ this.door=c; } start():void{ console.log('Benz go....!'); } stop(d:number):number{ console.log('Benz stop....!'); this.door = d; return this.door; } } const car2 = new Benz(4); car2.wheels = 10; car2.color = 'gray'; car2.door = 100; console.log(car2); car2.start(); let aaa:number = 0; aaa = car2.stop(200); console.log(aaa);
// ๊ฒฐ๊ณผ [LOG]: Bmw: { "wheels": 4, "color": "green" } [LOG]: "Bmw go....!" [LOG]: Benz: { "color": "gray", "wheels": 10, "door": 100 } [LOG]: "Benz go....!" [LOG]: "Benz stop....!" [LOG]: 200
extends (ํ์ฅ-2)
// interface Pro{ // color:string; // wheels:number; // name:string; // price:number; // start():void; // open():void; // buy():void; // } interface Car { color:string; wheels:number; start():void; } interface Toy{ name:string; open():void; } interface ToyCar extends Car, Toy { price:number; buy():void; } class Product implements ToyCar{ color='red'; wheels=4; name='doll'; price=500; start():void{ console.log('start....!'); } open():void{ console.log('open stop....!'); } buy():void{ console.log('buy stop....!'); } } const person1 = new Product(); console.log(person1); person1.start(); person1.open(); person1.buy();
ํจ์ ํ์ ์ ์ ๋ฐฉ๋ฒ
์์ 1
function add(num1:number , num2:number):number{ return num1+num2; } console.log(add(10,20)); // 30 function isAdult(age:number):boolean{ return age > 19; } console.log(isAdult(30)); // true
์์ 2
- ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํด ์ฃผ์ง ์๋๋ค๋ฉด TS ๋ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
function hello(name:string):string{ return `Hello, ${name || "world"}`; // name์ด ๋ค์ด์ค๋ฉด name ์ถ๋ ฅ, ์๋๋ผ๋ฉด "world" ๋ฅผ ์ถ๋ ฅํ๋ผ } const result = hello(); // ์๋ฌ๋ฐ์ const result2 = hello('kim'); console.log(result, result2);
- ์ด๋ฅผ ์ก๊ธฐ ์ํด์ ์ ํ์ ๋งค๊ฐ๋ณ์ ? ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
// ์๋ฌ๊ฐ ๋์ค์ง ์๊ฒ ์์ฑํ๋ ค๋ฉด? ์ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ด์ฉํ์! function hello(name?:string){ // ๋ณ์? -> ์ ํ์ ๋งค๊ฐ๋ณ์ return `Hello, ${name || "world"}`; } const result = hello(); const result2 = hello('kim'); console.log(result, result2);
- ์ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ if๋ฌธ์ ์ฌ์ฉํ๋ค๋ฉด?
function hello(name:string):string{ if(name == undefined) { return `Hello, world` }else{ return `Hello, ${name}` } }
- ์ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋งค๊ฐ๋ณ์์ ์ด๊ธฐ ๊ฐ์ ์ง์ ํด์ค์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
function hello2(name = 'world'):string{ // ๋ณ์? -> ์ ํ์ ๋งค๊ฐ๋ณ์ return `Hello, ${name}`; } const result3 = hello2(); const result4 = hello2('kim'); console.log(result3, result4);
๋๋จธ์ง ๋งค๊ฐ๋ณ์
function add(...nums:number[]):number { return nums.reduce((result, num) => result + num); } console.log(add(1, 2, 3)); // 6 console.log(add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)); // 55
์์ 4
interface User { name:string; age:number; } function join(name:string, age:number):User { return{ name, age }; }; const person1:User = join('์ ํ๋ง', 60); console.log(person1); /* { "name": "์ ํ๋ง", "age": 60 } */ /* // interface ์์ด ์ง์ ๋ช ์ํด์ฃผ๋ ๋ฐฉ๋ฒ function join(name:string, age:number):{name:string, age:number} { return{ name, age }; }; const person1:{name:string, age:number} = join('์ ํ๋ง', 60); console.log(person1); */ // this? ๊ฐ์ฒด๋ class ์์ ์ฌ์ฉ
ํ์ดํํจ์๋ก ์์
interface User { name:string; age:number; } interface Func { (name:string, age:number):User; } const join:Func = (name, age) => { return { name, age }; } const person1:User = join('์ ํ๋ง', 60); console.log(person1);
๋ฆฌํฐ๋ด(Literal types) / ์ ๋์จ(Union types) / ๊ต์ฐจํ์ (Intersection types)
๋ฆฌํฐ๋ด
- ๋ฆฌํฐ๋ด์ด๋? type์ ์๋ตํ๋๋ผ๋, ์ด๊ธฐ๊ฐ์ ๋ฐ๋ผ type์ด ๊ณ ์ ๋๋ค๋ ๊ฒ ์ฆ, ์ ํํ ๊ฐ์ด ์ง์ ๋จ์ ๋งํฉ๋๋ค.
- ๋ฌธ์์ด์ด๋ ์ซ์์ ์ ํํ ๊ฐ์ ์ง์ ํ๋ค๋ ๊ฒ์ ๋๋ค.
์ ๋์จ → | (๋๋)
- ์ฌ๋ฌ๊ฐ์ ์ ํ์ง๋ฅผ ์ค ์ ์๋ ํ์ ์ ๋๋ค.
const userName1 = 'Bob'; // type -> 'Bob' (์์ ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ ์์ฒด๊ฐ type์ด ๋๋ค) let userName2 = 'Tom'; // type -> string let userName3: string | number; userName3 = '์ ๋จ์'; userName3 = 100; console.log(userName1, userName2, userName3); type Job = "police" | "developer" | "teacher"; interface User{ name : string; job : Job; } const user:User ={ name : "Bob", job : "developer" // job : "student" -> ์๋ฌ } console.log(user.name, user.job);
๊ต์ฐจํ์ -> & (์ฌ๋ฌ๊ฐ์ ํ์ ์ ํ๋๋ก ํฉ์น๋ค)
interface Car{ name : string; start(): void; } interface Toy{ name : string; color : string; price: number; } const toyCar : Toy & Car ={ name: '๋ฒ์ค', color: 'blue', price: 10000, start(){ console.log(this.name, this.color, this.price+'์'); } } toyCar.start(); // "๋ฒ์ค", "blue", "10000์"
class ES6 (ํด๋์ค ๋ณต์ต)
JS
- ์๋ฐ์คํฌ๋ฆฝํธ(.js) ์์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
class Car{ constructor(color){ this.color = color; } start(){ console.log(this.color + " car start!"); } } const bmw = new Car("red"); bmw.start();
TS
- .ts์์๋ color ๋ถ๋ถ์์ ์ค๋ฅ 3๊ฐ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ํด๋์ค ๋งด๋ฒ๋ณ์๋ฅผ ๊ผญ ์ ์ธ์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.(.ts)
class Car{ color: string; constructor(color: string){ this.color = color; } start(){ console.log(this.color + " car start!"); } } const bmw = new Car("red"); bmw.start();
public ์ฌ์ฉ
public ์ด๋? → ์ ์ญ ์ด๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
class Car{ // color: string; constructor(public color: string){ // constructor ๋ด๋ถ์์ public ์ฌ์ฉ this.color = color; } start(){ console.log(this.color + " car start!"); } } const bmw = new Car("red"); bmw.start();
readonly ์ฌ์ฉ(์ฝ๊ธฐ์ ์ฉ)
class Car{ // color: string; constructor(readonly color: string){ this.color = color; } start(){ console.log(this.color + " car start!"); } } const bmw = new Car("red"); bmw.start(); // bmw.color='red'; // ์๋ฌ : ์ฝ๊ธฐ ์ ์ฉ์ด๋ผ ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ค
- public / read-only ๋ ํ๋ผ๋ฏธํฐ์ ์์(const)๋ฅผ ๋ง๋ค์ด ์ฃผ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ดํด๊ฐ ์ฝ์ต๋๋ค.
โญโญโญโญโญ ์ ๊ทผ ์ ํ์(Access Modifier) โญโญโญโญโญ
- public → ์์ ํด๋์ค, ํด๋์ค ์ธ์คํด์ค ๋ชจ๋ ์ ๊ทผ ๊ฐ๋ฅ (์๋ตํ๋ฉด ๊ธฐ๋ณธ๊ฐ)
- private → ํด๋น ํด๋์ค ๋ด๋ถ์์๋ง ์ ๊ทผ ๊ฐ๋ฅ (์์ ํด๋์ค ์ฌ์ฉ ๋ถ๊ฐ)
- protected → ์์ํด๋์ค์์ ์ ๊ทผ ๊ฐ๋ฅ/ ํด๋์ค ์ธ์คํด์ค์์ ์ ๊ทผ ๋ถ๊ฐ
ํด๋์ค ์ธ์คํด์ค → ์ด์ฉ๊ณ = new ddd → ์ด์ฉ๊ณ .name ์ด๋ฐ์์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
public
class Car{ public name:string = "๋ฅ์ฐจ"; color:string; constructor(color:string){ this.color=color; } public start(){ // ํจ์์๋ public ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค console.log('๋ถ๋ชจํด๋์ค strat!!',this.name, this.color); } } class Bmw extends Car{ constructor(color:string){ super(color); } showName(){ console.log('์์ํด๋์ค strat!!', this.name , this.color); // ๋ถ๋ชจ์๊ฒ์ ๋ฌผ๋ ค๋ฐ์ name, color (์์ ํด๋์ค์์๋ ์ฌ์ฉํ ์ ์๋ค) } } const mycar = new Bmw("red"); mycar.name="์์ฐจ"; // ์ธ์คํด์ค์์ ์ง์ ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ค (์ธ์คํด์ค์ ์ ๊ทผ ๊ฐ๋ฅํ๋ค) mycar.start(); // "๋ถ๋ชจํด๋์ค strat!!", "์์ฐจ", "red" mycar.showName(); // "์์ํด๋์ค strat!!", "์์ฐจ", "red"
private
class Car{ private name:string = "๋ฅ์ฐจ"; color:string; constructor(color:string){ this.color=color; } private start(){ // ํจ์์๋ public ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค console.log('๋ถ๋ชจํด๋์ค strat!!',this.name, this.color); } } class Bmw extends Car{ constructor(color:string){ super(color); } showName(){ console.log('์์ํด๋์ค strat!!', this.name , this.color); // ๋ถ๋ชจ์๊ฒ์ ๋ฌผ๋ ค๋ฐ์ name, color (์์ ํด๋์ค์์๋ ์ฌ์ฉํ ์ ์๋ค) } } const car = new Car("pink"); car.color = "blue"; console.log(car.color); const mycar = new Bmw("red"); mycar.name = "์์ฐจ"; // ์๋ฌ -> ์์ ํด๋์ค์์ ์ ๊ทผํ ์ ์๋ค. mycar.color = "green" mycar.start(); // ์๋ฌ -> ์์ ํด๋์ค์์ ์ ๊ทผํ ์ ์๋ค. mycar.showName(); // "์์ํด๋์ค strat!!", "์์ฐจ", "red"
protected
class Car{ protected name:string = "๋ฅ์ฐจ"; color:string; constructor(color:string){ this.color=color; } protected start(){ console.log('๋ถ๋ชจํด๋์ค strat!!', this.name, this.color); } } class Bmw extends Car{ constructor(color:string){ super(color); } showName(){ console.log('์์ํด๋์ค strat!!', this.name , this.color); //์์ ํด๋์ค์์๋ ์ฌ์ฉํ ์ ์๋ค super.start(); } } const car = new Car("pink"); car.color = "blue"; const mycar = new Bmw("red"); // mycar.name="์์ฐจ"; // ์๋ฌ : ์ธ์คํด์ค์์ ์ง์ ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ค // mycar.start(); mycar.showName();
์ ๋ค๋ฆญ
- ์ ๋ค๋ฆญ์ ํน์ ํ์ ์ ์ด์ฉํด์ ํ ํ๋ฆฟ์ฒ๋ผ ํจ์๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค
ํจ์์ ๋งค๊ฐ๋ณ์์ ์ ๋ฌ ์ธ์์ ํ์ ์ด ๋ค๋ฅผ๋…
function getSize(arr: number[]): number{ return arr.length; } const arr=[1,2,3]; console.log(getSize(arr)); //3 const arr2 = ['a','b','c','d','e']; console.log(getSize(arr2)); //์๋ฌ๊ฐ ๋ฐ์ํ๋ค
- ์ ๋์จ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
function getSize(arr: number[] | string[]): number{ return arr.length; } const arr=[1,2,3]; console.log(getSize(arr)); // 3 const arr2 = ['a','b','c','d','e']; console.log(getSize(arr2)); // 5
- ์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ ๋ฒ
function ํจ์๋ช <ํ์ ํ๋ผ๋ฏธํฐ>(๋งค๊ฐ๋ณ์:ํ์ ํ๋ผ๋ฏธํฐ):ํ์ {}
function getSize<T>(arr: T[]):number{ return arr.length; } const arr = [1, 2, 3]; console.log(getSize<number>(arr)); const arr2 = ['a','b','c','d','e']; console.log(getSize<string>(arr2)); const arr3 = [true,false,false,true]; console.log(getSize<Boolean>(arr3)); // any ๋ฅผ ์ฐ๋ ๊ฒฝ์ฐ๋?? type script๋ฅผ ์ธ ์ด์ ๊ฐ ์๋ค. ๊ทธ๋ฅ vanila๋ก ์ฐ๋ฉด ๋๋ค. // <ํ์ ํ๋ผ๋ฏธํฐ> -> <T>,<A>,<X>... ์๋ฌด ๊ฐ์ด๋ ์ฌ์ฉ๊ฐ๋ฅ ํ๋ค
์ ๋ค๋ฆญ ์์ 2
interface Mobile<T>{ name: string; price: number; option: T; } /* const obj1: Mobile<object> ={ name: '์ผ์ฑ s20', price: 100, option: { color: 'red', coupon: false } }; */ const obj1: Mobile<{color:string; coupon:boolean}> ={ name: '์ผ์ฑ s20', price: 100, option: { color: 'red', coupon: false } }; console.log(obj1.name , obj1.price +'๋ง์', '์์:'+obj1.option.color, '์ฟ ํฐ:'+obj1.option.coupon); const obj2: Mobile<string> ={ name: '์ผ์ฑ s22', price: 120, option: 'android OS' }; console.log(obj2.name , obj2.price +'๋ง์', obj2.option);
๋ง๋ฌด๋ฆฌํ๋ฉฐ
ํ์ ์คํฌ๋ฆฝํธ์ ๊ธฐ์ด๋ฅผ 1, 2ํธ์ ๊ฑธ์ณ์ ๊ณต๋ถํด ๋ณด์์ต๋๋ค.
๋ณ์ ๋ฟ๋ง์๋๋ผ ํจ์๊น์ง ๋ชจ๋ ๊ณณ์ ํ์ ์ ์ง์ ํด์ค์ผ๋ก์จ ์ค๋ฅ๋ฅผ ์ต์ํ ํ๋ค๋ ๊ฒ์ด ๋งค๋ ฅ์ ์ผ๋ก ๋ค๊ฐ์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์์์ ๊ฐ์ฅ ๋ง์ด ๊ฒช๋์ผ "์ค๋ฅ๋ ์๋จ๋๋ฐ ๊ฐ์ด ์๋์์"๊ฐ ์๋ ํ์ ์คํฌ๋ฆฝํธ! ํ๋ฒ์ฏค์ ๊ผญ ๊ณต๋ถํด๋ณด์๋ฉด ์ข์ ๋ฏ ์ถ์ต๋๋ค.
๋๊ธ๊ณผ ๊ณต๊ฐ์ ํญ์ ํ์์ ๋๋ค!
'๐ FrontEnd > TypeScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
TypeScript ํ์ ์คํฌ๋ฆฝํธ ๊ธฐ์ด -1 (0) 2022.11.08 TypeScript ํ์ ์คํฌ๋ฆฝํธ ์ค์น ๋ฐ ์ฌ์ฉ (VScode ์์) (0) 2022.11.08