abstract class User{
constructor(
private firstName:string,//본인만 접근 가능
private lastName:string,
protected nickname:string//본인과 자식 클래스에서 접근 가능
){}
getFullName(){
return `${this.firstName} ${this.lastName}`
}
abstract getNickName():void
//추상 메서드는 상속받은 클래스에서 반드시 구현해야 함.
}
class Player extends User{
getNickName(){
console.log(this.nickname)//protected는 접근 가능함
}
}
const p1=new Player("wonji","kang","1g");
}
추상 메서드는 상속받은 클래스에서 반드시 구현해야 함.
public: 모든 클래스에서 접근 가능
private: 해당 클래스 내에서만 접근 가능 (자식 클래스에서도 접근 불가)
protected: 해당 클래스와 자식 클래스에서 접근 가능
type Movie={
[key:string]:string
}
class MovieIsGood{
//클래스 내에서 생성자없이 변수 선언하는 방법
// words는 initializer 없이 선언해주고 contructor에서 수동으로 초기화
//private movies:Movie={}; 아래와 같음
private movies:Movie;
constructor(){
this.movies={};
}
add(thing:Ani){
if(this.movies[thing.name]===undefined) this.movies[thing.name]=thing.genre;
}
del(thing:Ani){
if(this.movies[thing.name]!==undefined) delete this.movies[thing.name];
}
show(){
console.log(this.movies)
}
}
class Ani{
constructor(public name:string,public genre:string){}
getInfo():Movie{
return {[this.name]:this.genre};
}
}
const movieToday=new MovieIsGood();
const 짱구=new Ani("짱구","comic");
const 인어공주=new Ani("인어공주","story");
const 가필드=new Ani("가필드","family");
인어공주.getInfo();
movieToday.add(짱구);
movieToday.add(인어공주);
movieToday.add(가필드);
movieToday.del(가필드);
movieToday.show();
type의 용도 :
1. 특정 값이나 객체의 값에 대한 타입을 지정해줄 수 있다.
2. Type alias(타입에 대한 별명)를 만들어줄 수 있다.
3. 타입을 특정한 값을 가지도록 제한할 수 있다.
type Name=string;//2 allias(별칭)
type Fruit={//1
name:Name,
sugarContent:number
}
const banana:Fruit={
name:'banana',
sugarContent:7
}
//1
type Friends=Array<string>
//3
type Team="red"|"blue"|"yellow";
type Player={
nickname:string,
team:Team
}
const me:Player={
nickname:"me",
team:"red"
}
용도 : 오직 오브젝트의 모양을 특정함
type Team="red"|"blue"|"yellow";
interface Player{// 이 부분만 달라짐
nickname:string,
team:Team
}
const me:Player={
nickname:"me",
team:"red"
}
type Job="programmer"|"dentist"|"teacher";
interface Family{
father?:string,
mother?:string,
sibling?:string
}
interface personnel{
name:string,
age:number,
}
interface Info extends personnel{
//type Info = personnel& 와 같음
family?:Family,
job:Job
}
const me:Info={
name:"1g",
age:2,
family:{
father:"dad",
mother:"mom"
},
job:"programmer"
}
console.log(me)
interface를 여러 번 만들어도 알아서 TS가 하나로 합쳐줌.
: 클래스 가이드 라인. extends처럼 상속이 아니라 형식을 검사함. 파일 사이즈 줄일 수 있음.
interface User{
firstName:string,
lastName:string,
sayHi(name:string):string
}
class Player implements User{
constructor(
public firstName:string,
public lastName:string
){}
sayHi(name:string){
return `${this.firstName} ${this.lastName}`
}
}
인터페이스 상속 시 property는 private/protected가 될 수 없음. 고로 interface와 상속받은 클래스에서의 type은 public이 되어야 함.
제네릭 : placeholder 타입을 TS가 concreate 타입으로 바꿔줌.
interface Astorage<T>{
[key:string]:T
}
class LocalStorage<T>{
private storage:Astorage<T>
constructor(){
this.storage={};
}
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 stringStorage=new LocalStorage<string>()
stringStorage.set("hello","nice to meet you")
stringStorage.get("hello")
const booleanStorage=new LocalStorage<boolean>()
booleanStorage.set("hi",true);
booleanStorage.get("hi");