ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • typescript Interface
    Programming/JavaScript & TypeScript 2022. 2. 18. 14:23
    728x90

    01. Wath art Interfaces

    어떤 type을 만들어 내는 방식

    예전에는 내부적으로 숨겨져있고, 외부적으로 드러나는 호출 방식 

    내부적인것과 관계없이 외부적으로 들어나는 객체의 사용방식

     

    //interface가 없으면
    function hello2(person:{name:string, age:number}): void{
        console.log(`hi my name ${person.name}, age is ${person.age} `);
    }
    
    
    //interface 사용하면...
    interface Person1 {
        name:string,
        age:number
    }
    
    function hello1(person:Person1): void{
        console.log(`hi my name ${person.name}, age is ${person.age} `);
    }
    
    const p1:Person1 = {
        name:"Mark",
        age:39
    }
    
    hello1(p1)
    //사실 {name:string, age:number} 로만 호출도 가능하다. 구조가 같아서 호출 가능
    //근데 이 부분을 interface으로 만들면 더 깔끔하다.
    hello1({name:"Qwe", age:45})

    타입스크립트에서는 interface가 중요하다.

    javascript에서는 없는 문법이며, 컴파일 했을 때 javascript에는 나오지 않는다.

    컴파일 타임에만 필요하다. 컴파일 타임에 문제가 없는지 관계를 규명한다.

     

    컴파일 결과 (javascript)

    "use strict";
    function hello1(person) {
        console.log(`hi my name ${person.name}, age is ${person.age} `);
    }
    const p1 = {
        name: "Mark",
        age: 39
    };
    hello1(p1);
    hello1({ name: "Qwe", age: 45 });

     

    02. Optional Property(1)

    항상 필요한 property가 아니고, 필요에 따라서 있을 수도 있고, 없을 수도 있는 property

    interface Person2 {
        name:string; 
        age?:number; //?달아 optional을 표현
    }
    
    function hello(person:Person2):void {
        console.log(`hello person2 name ${person.name}입니다.`)
    }
    
    hello ({name:"hong", age:123})
    hello({name:"qwe"}) //Person2에 age를 않넣어줘도 오류가 안난다. optional이기 때문에
    
    const a1:Person2 = {
        name:"hh"
    }
    hello(a1)

    03. Optional Property(2)

    interface에 optional type을 넣는 다른 방법

    indexable type ...

    문법은 

    [index:string]:type

    a['index] 와 같은 의미...어떤것을 프로퍼티 이름으로 지정할 수 있고, 

    근데 사용하는 쪽에서는 호출하는 쪽 구조를 알아야되서 잘 안쓸수도 있겠다는 생각이 든다....

    interface Person3 {
        name:string;
        age?:number;
        [index:string]:any; //어떤 이름의 프로퍼티가 와도 괜찮아....indexable type
    }
    
    function hello3(person:Person3):void {
        console.log(`Hello ${person.name}`)
        console.log(person.father)
        console.log(person['father'])
        console.log(person.mother)
    }
    
    const p31:Person3 = {
        name:'Mark',
        age:39,
    };
    
    const p32:Person3 = {
        name:"hong",
        systers:['A', 'B', 'C'] //[index:string]:any에 대응되는 부분
    }
    
    const p33:Person3 = {
        name:"Bob",
        father : p31,
        mother:p32
    };
    hello3(p33)

    04. function in interface

    interface 안에 함수를 정의하는 방법 

    hello()을 객체를 정의하는 곳에서 같이 만들어야한다. p41, p42 참고

    array function에서는 this를 사용할 수 없다. 

    interface Person4 {
        name:string;
        age:number;
        hello():void //hello를 객체에서 만들어내야한다.
    }
    
    const p41:Person4 = {
        name:'Mark',
        age:39,
        //만드는 방법 1
        //hello의 타입을 function으로 지정 
        hello:function():void {
            console.log(`hello ${this.name}`)
        }
    }
    
    const p42:Person4 = {
        name:'Mark',
        age:39,
        //만드는 방법 2
        //hello를 ()로 사용하는 방법
        hello():void {
            console.log(`hello ${this.name}`)
        }
    }
    
    // const p43:Person4 = {
    //     name:'Mark',
    //     age:39,
    //     //만드는 방법 3, arrow function
    //     //화살표함수는 this를 사용할 수 없다..에러에러에러!!
    //     //global this를 가르킨다
    //     hello:():void  => {
    //         console.log(`hello ${this.name}`)
    //     }
    // }
    
    p41.hello()
    p42.hello()

    05. class implements interface

    interface를 사용해서 클래스를 구현하는 방법...

    java에서 많이 썼던것 같음...

    interface는 컴파일 타임에서만 사용

    클래스는 javascript의 feature로 들어가 있음

    interface에 있는 내용을 바탕으로 클래스를 만들어 내는 것 

    interface IPerson1 {
        name:string;
        age?:number;
        hello():void;
    };
    
    class Person implements IPerson1 {
        name: string;
        age?: number | undefined; //없어도 큰 문제가 없다.
        hello(): void {
            //throw new Error("Method not implemented.");
            console.log(`Class Person hello ${this.name}`)
        }
    
        constructor(name:string) {
            this.name = name
        }
    }
    
    //클래스 또한 타입처럼 사용가능
    
    //Person이 IPerson1을 구현했기 때문에 아래와 같이 사용해도 된다.
    //const person:IPerson1 = new Person('Hong');
    const person = new Person('Hong');
    person.hello()

    oop에서 interface만 노출하고 구현은 노출하지 않는 방법..

    06. interface extends interface

    interface 끼리 상속하는 방법...

    interface IPerson2 {
        name:string;
        age?:number
    }
    
    interface IKorea extends IPerson2 {
        city:string;
    }
    
    //IKorea는 IPerson2를 확장하는것
    
    const k:IKorea = {
        name:"Hong",
        city:"seoul"
    };
    
    console.log(k.name, k.city)

    07.  function interface

    함수를 곧 interface로..

    age는 optional이니까 있어도, 없어도 상관없고

    대신 구현하는 곳...즉 function(name:string, age:number)로 쓰면 에러가 난다. 

    이유는 interface와 function이 맞지 않다...

    interface쪽에는 number | undefined이고 function에 있는건 number이기때문에 

    더 큰 타입을 작은 타입에 넣지 못하기 때문이다...

    //helloperson을 사용하는 객체는 (name:string, age?:number):void 형태로 작성되어야한다.
    interface HelloPerson {
        (name:string, age?:number):void
    }
    
    //helloPerson은 뒤에 따라오는 function이하를 보는게 아니라 HelloPerson interface를 본다. 
    //interface와 type이 맞아야 한다...
    //그래서 function(name:string, age:number)는 에러이다. 
    //interface의 age는 number | undefinded 타입이고, 
    //function의 age는 number다...
    
    const helloPerson:HelloPerson = function(name:string) {
        console.log(`helloPerson ${name}`)
    
    }
    
    helloPerson('Mark', 40)

    08. Readonly interface properties

    interface Person8 {
        name:string;
        age?:number;
        readonly gender:string;
    }
    
    const p81:Person8 =  {
        name:'Mark',
        gender:'male'
    };
    
    //error
    //readonly 타입에 변경하므로...
    //p81.gender = 'female'

    09. type alias vs interface

    추가적으로 읽어볼 블로그 

    https://poiemaweb.com/typescript-alias

     

    TypeScript - Type Alias | PoiemaWeb

     

    poiemaweb.com

    https://joonsungum.github.io/post/2019-02-25-typescript-interface-and-type-alias/

     

    TypeScript에서 Type을 기술하는 두 가지 방법, Interface와 Type Alias

    타입스크립트를 사용하기 시작한 뒤로 type을 기술할 때, 일반적인 상황에서는 특별한 고민 없이 interface를 사용하고 있었다. TypeScript 공식 문서에서 특별한 상황이 아니라면 interface의 사용을 권

    joonsungum.github.io

    https://poiemaweb.com/typescript-interface

     

    TypeScript - Interface | PoiemaWeb

    인터페이스는 일반적으로 타입 체크를 위해 사용되며 변수, 함수, 클래스에 사용할 수 있다. 인터페이스는 여러가지 타입을 갖는 프로퍼티로 이루어진 새로운 타입을 정의하는 것과 유사하다.

    poiemaweb.com

    //function을 표현하는 방법
    //type alias
    type EatType = (food:string) => void;
    
    //interface 
    interface IEat {
        (food:string):void;
    }
    
    //array를 표현하는 방법
    //type alias
    type PersonList = string[];
    
    //interface
    interface IPeronList {
        [index:number]:string; //indexable type
    }
    
    //intersection
    
    interface ErrorHandling {
        success:boolean;
        error?:{message:string};
    }
    interface ArtistsData {
        artists:{name:string}[]
    }
    
    //type alias
    type ArtistsResponseType = ArtistsData & ErrorHandling
    //interface
    interface IArtistsResponse extends ArtistsData, ErrorHandling{}
    
    let art:ArtistsResponseType;
    let iar:IArtistsResponse;
    
    
    //union type
    
    interface Birt {
        fly():void;
        layEggs():void;
    }
    interface Fish {
        swit():void;
        layEggs():void;
    }
    // type은 union 가능...
    type PetType = Birt | Fish;
    
    //union type은 extends나 implements 불가
    //어느 타입인지 혼동된다...타입이 두개잖아...
    // interface IPet extends PetType {}
    // class Pet implements PetType {} 
    
    
    //Declaration Mergin - interface
    interface MerginInterface {
        a:string
    }
    interface MerginInterface {
        b:string
    }
    //두개의 interface가 이름이 같으므로 하나로 합쳐진다..
    let mi:MerginInterface;
    
    
    //type alias 는 merging가 불가 
    //같은 이름이면 에러 남
    // type MergingType = {
    //     a:string;
    // }
    // type MergingType = {
    //     b:string;
    // }

     

    'Programming > JavaScript & TypeScript' 카테고리의 다른 글

    Redux Toolkit  (0) 2022.04.01
    typescript class  (0) 2022.02.20
    TypeScript Compiler(타입스크립트 컴파일러)  (0) 2022.02.16
    타입 별칭(Type Alias)  (0) 2022.02.16
    타입 호환성(type Compatibility)  (0) 2022.02.16
Designed by Tistory.