let's get IT with DAVINA ๐ป
TypeScript(Interface) ๋ณธ๋ฌธ
๋ค์ด๊ฐ๊ธฐ ์ ํ๋ ์๊ณ ๊ฐ์ +1
Static
- JS method์ ๋๋ค.
- method๋ฅผ ํธ์ถํ ๋, ์๋๋ new Hi์ ๊ฐ์ instance๋ฅผ ์๋ก ์์ฑํด์ hello()๋ฅผ ํธ์ถํด์ผํ๋๋ฐ
- static ์ ์ ๋ฉ์๋๋ฅผ ์ฐ๋ฉด, ๋ฐ๋ก class์์ method ํธ์ถ ๊ฐ๋ฅ!
class Hi {
constructor() {
static hello() {
return "hello";
}
}
}
Hi.hello(); //ok to go
Type VS Interface
- ๋ ๊ฐ์ ๊ณตํต ๋ชฉํ?
- object์ ๋ชจ์๊ณผ ํ์ ์ ์ค๋ช ํด์ค๋๋ค.
Type์ ๊ธฐ๋ฅ
- Type (Object)
- Shape of object (๊ฐ์ฒด๊ฐ ์ด๋ป๊ฒ ์๊ฒผ๋๊ฐ?)๋ฅผ ์ ์ ์์ต๋๋ค.
- Property Name์ ์ ์ ์์ต๋๋ค. -> nickname, age
- Property Type์ ์ ์ ์์ต๋๋ค. -> string, number
type Player = {
nickname:string,
age: number
}
const vini : Player = {
nickname: "vini",
age: 28
}
- Type (String)
- type์ด object๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ํ์ ์์ (string์์) ์ง์ ํด์ค ์ ์์ต๋๋ค.
type Food = string;
const kimchi : Food = "delicious"
- Type (aliases)
- type์ ์ง์ ํด์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
type Nickname=string
type Age=number
type Player = {
nickname:Nickname,
age: Age
}
- Type (Specific value)
- Type๋ฟ๋ง ์๋๋ผ ํน์ ํ๊ฒ ์ง์ ๋ ๊ฐ๋ฅํฉ๋๋ค.
type Team= "red"|"blue"|"yellow"
type Player = {
nickname: string,
team:Team
}
const vini:Player={
nickname:"vini",
team:"yellow" //"pink"๋ ๋ถ๊ฐ๋ฅ!
}
์ด ๋, Object์ ๋ชจ์๊ณผ ํ์ ์ ์ง์ ํด์ฃผ๊ธฐ ์ํด Type๋ง๊ณ ์ธ ์ ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์?
โท Interface!!
Interface
- only 1๊ฐ์ ๊ธฐ๋ฅ๋ง ํจ!
- type์ด ๋ ๋ง์ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- Object์ shape & type์ explainํด์ค๋๋ค.
type๊ณผ ๋น๊ตํด์, interface๋ฅผ ์ธ ๋๋ "="์ ๋นผ์ฃผ๊ณ ์ฌ์ฉํด์
type Player = {
nickname: string,
team:Team
}
interface Player {
nickname: string,
team:Team
}
class ์ ์ฐ์์์ ๋งค์ฐ ์ ์ฌํ๋ค (๊ธฐ๋ฅ๋ ๋น์ท)
- ์์ ๋ฐฉ๋ฒ์ด type๊ณผ ๋ค๋ฆ
- ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ฒ๋ผ ๋ณด์ผ ์ ์๊ฒ ํด์ค
interface User {
name:string
}
interface Player extends User {
}
const vini:Player={
name: "vini"
}
์์ ์์๊ฐ type์ด์๋ค๋ฉด?
type User = {
name:string
}
type Player = User & { //&์ฐ์ฐ์ ์ฌ์ฉํด์ผํจ
}
const vini:Player={
name: "vini"
}
property accumulate์ด ๊ฐ๋ฅํด์ง๋๋ค.
- ์ฌ๋ฌ ๊ฐ์ property๋ฅผ ์ถํ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
interface User {
name:string
}
interface User {
lastName: string
}
interface User {
age:number
}
const vini:User={
name:"vini",
lastName: "An",
age: 28
}
์์ ์์๊ฐ type์ด์๋ค๋ฉด?
type User = {
name:string
}
type User = {
lastName: string //โ๏ธ User์ ๊ณ์ ์ ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋์๋ผ!!! ํ๋ฒ์ ์์ฑํด์ค์ผ๋ผ!!
}
Interface VS class
class
abstract class๋ฅผ ์ฐ๋ ์ด์ ?
โท ์์๋ฐ๋ class๋ค์ด ์ด๋ค method๋ฅผ ๊ตฌํํ๋์ง๋ฅผ ๋ณด์ฌ์ฃผ์ง,
์ด๋ป๊ฒ ๊ตฌํํ๋์ง๋ abstract class์์ ์ด๋ฏธ ๋ค ํด์ฃผ๋๊น!
abstract class User { //abstract class=> JS์์ class User๋ก ์ผ๋ฐ์ ์ธ ํด๋์ค๋ก ๋ฐ๋
constructor(
protected firstName:string, //protected=> ์ถ์ํด๋์ค๋ก๋ถํฐ ์์๋ฐ์ ํด๋์ค๋ค์ด property์ ์ ๊ทผํ๋๋ก ํด์ค
protected lastName:string
) {}
abstract sayHi(name:string):string
abstract fullName():string
}
class Player extends User{
fullName() {
return `${this.firstName} ${this.lastName}`
}
sayHi(name: string) { //abstract class๋ ์ด๋ค method๋ฅผ implementํด์ผ๋๋์ง๋ฅผ ์๋ ค์ฃผ๊ธฐ ๋๋ฌธ์, type์ ํ๋ฒ ๋ ์ง์ ํด์ค์ผํจ
return `Hello ${name}. My name is ${this.fullName()}`
}
}
Interface
- ๋ด๊ฐ ์ํ๋ method์ property๋ฅผ class๊ฐ ๊ฐ์ ๋ก ๊ฐ์ง๋๋ก ํ๊ฒ ํด์ค
- JS์์ interface๊ฐ ์์! TS์์๋ง ์กด์ฌํ๊ธฐ ๋๋ฌธ์, JS ์ฝ๋์์ ๋ณด์ด์ง๊ฐ ์์
- JS code๋ฅผ smaller, lighterํ๊ฒ ๋ง๋ค์ด์ค ์ ์์ด์ง
interface User{
firstName: string,
lastName: string,
sayHi(name:string):string
fullName():string
}
interface Human{
health: number
}
//์์ interface๋ค์ JS์์ ์๋ณด์
//implements=JS์๋ ์๋ ๋ฉ์๋๋ผ class Player{}๋ก ๋์ค๊ฒ ๋จ
class Player implements User,Human {
constructor(
public firstName: string, //๋ฌธ์ ์ ์ด ์๋ค๋ฉด.. private&protected๋ ์๋จ!
public lastName: string,
public health: number
){}
fullName() {
return `${this.firstName} ${this.lastName}`;
}
sayHi(name: string) {
return `Hello ${name}. My name is ${this.fullName()}`
}
}
type PlayerA = {
firstName: string
}
interface PlayerB{
firstName: string
}
//type & interface ๋ ๋ค implement ๊ฐ๋ฅ
class User implements PlayerA{
constructor(
public firstName: string
){}
}
โญ๏ธ object์ ๋ชจ์๊ณผ ํ์ ์ ์ ์ํ๊ณ ์ถ์ผ๋ฉด interface๋ฅผ ์ฐ๊ณ , ์ด์ธ์ ๊ฒฝ์ฐ์ ๋ค type์ ์ฐ๋ฉด ๋ผ!
Polymorphism
- ๋คํ์ฑ => ๋ค์ํ ๋ชจ์์ ์ฝ๋๋ฅผ ๊ฐ์ง ์ ์๊ฒ ํด์ค๋๋ค
- generics๋ฅผ ์ด์ฉํ๋ฉด ๋๊ฒ ์ฐ?!!?!?
- not a concrete type, it is a placeholder type
interface SStorage<T> {
[key:string]: T
}
class LocalStorage<T> {
private storage : SStorage<T> = {}
set(key:string, value: T){
this.storage[key]=value;
}
remove(key:string){
delete this.storage[key]
}
get(key:string):T{
return this.storage[key]
}
clear(){
this.storage={}
}
}
const stringsStorage=new LocalStorage<string>()
stringsStorage.get("ket")
stringsStorage.set("hello", "how are you") //generics๋ฅผ string์ผ๋ก ์ง์ ํด์คฌ๊ธฐ ๋๋ฌธ์, string์ผ๋ก value๋ฅผ ์ง์ ํ๋ผ๊ณ ํจ
const booleanStorage=new LocalStorage<boolean>();
booleanStorage.get("XXX")
booleanStorage.set("hello", true) //generics๋ฅผ boolean์ผ๋ก ์ง์ ํด์คฌ๊ธฐ ๋๋ฌธ์, boolean type์ผ๋ก value๋ฅผ ์ง์ ํ๋ผ๊ณ ํจ
'DEV_IN > TypeScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โ๏ธ ์์ฃผ ๋ณผ ์ ์๋ Errors (0) | 2023.02.17 |
---|---|
TypeScript(apply) (2) | 2023.02.17 |
TypeScript(Classes) (4) | 2023.02.12 |
TypeScript (Function) (3) | 2023.02.09 |
TypeScript๋? & Types (0) | 2023.02.09 |
Comments