본문 바로가기
typescript

[typescript] interface

by 남민섭 2023. 2. 24.
728x90
반응형

interface(반복적인 사용을 원하는 경우)

타입스크립트의 여러 객체를 정의하는 일종의 규칙이며 구조이다

 

1. 객체의 타입정의

interface 인터페이스이름 {
         readonly key:key 타입;
         key?: key타입
}

2. 함수의 타입정의

interface 인터페이스 이름{
          호출 시그니쳐 정의
          (parameter: paremetertype): return type
}

 

3. 클래스의 타입정의

    implements 키워드 사용

실습

//객체는 프로퍼티에 대한 타입을 지정함
//옵셔널 프로퍼티 ?키워드 ---> 프로퍼티가 있어도되고 없어도됨  ?없으면 에러뜸
//읽기 전용 프로퍼티 ====> readonly키워드

//interface IUser {readonly name: string, age:number, isJob?:boolean}
interface IUser {
    readonly name: string, age:number, isJob?:boolean
}
let user1: IUser = {
    name: "green",
    age: 30,
    isJob: true
}

let user2: { readonly name: string, age:number, isJob?:boolean} = {
    name: "blue",
    age: 20,
    isJob: true
}

console.log(user1.name);
//user1.name = "dddd"  //읽기 전용이라 변경 불가능

numType = 30000;
// stringType = 20; 타입이 맞지않아서 오류

optional

?키워드는 사용하는 여러 선택적 개념

타입을 선언할 때 선택적으로 지정할 수 있음

위에 실습 내용에서 isJob를 ?키워드를 사용하여서 

isJob에 받을 인수가 없어도 에러가 안뜸

 

readonly 키워드는 읽기 전용

 

실습

interface Dog {
    readonly name: string,
    age: number
    color?:string
}
let dog1: Dog = {
    name: "구름",
    age: 3
}
let dog2: Dog = {
    name: "몽이",
    age: 2
}


type Score = "A" | "B" | "C" | "D" | "E" | "F" ;
interface Student {
    name: string;
    age: number;
    gender: string;
    [grade: number] : Score   //number 타입의 grade키가 옴
}
// 타입스크립트는  리터럴(값) 타입
//문자열 리터럴 타입 지정

let stu1: Student = {
    name: "창민",
    age: 30,
    gender: "남자",
    1: "A"
}

let stu2: Student = {
    name: "요한",
    age: 22,
    gender: "남자",
    1: "A"
}

//모든 파라미터 readonly
interface ReadUser  {
    name: String,
    age :Number,
    phone : String,
}

let readucer1: Readonly<ReadUser> = {
   name: "그린",
   age: 30,
   phone: "01012341234"
}
/* readucer1.name = "ddd";
readucer1.age = 50;
readucer1.phone = "Aa"; */

interface TV {
   turnOn(): Boolean;
   turnOff(): void;
}

const myTv: TV = {
   turnOn(){
       return true
   },
   turnOff(){
       console.log('off')
   }
}
interface SignUp {
   email: String;
   id: String;
   password: string
}

//클래스타입 인터페이스 !!!!!
//implements키워드
interface IStudent {
    name: string,
    getName(): String
}

class Student2 implements IStudent{
    name: string
    constructor(name:string){
        this.name = name;

    }
    getName(): string{
        return this.name
    }
}

const green = new Student2("green")
console.log(green.getName());

//인터페이스 확장
//인터페이스도 class 처럼 extends 키워드를 활용해 상속 할 수 있음
interface IAnimal {
    name: string;
}
interface ICat extends IAnimal {
    sound() : string;
}

class Cat implements ICat {
    name: string;
    constructor(name: string){
        this.name = name;
    }
    sound(): string {
        return "야옹";
    }
}

//같은 이름의 interface를 여러개 만들 수 있음.
//기존에 만들어진 interface에 내용을 추가할 때 유용함.
interface IName {
    name: string;
    age: number;
}

interface IName {
    color: string;
}
const iname: IName = {
    name: "a",
    age: 12,
    color: "Aa"
}
728x90
반응형

'typescript' 카테고리의 다른 글

[typescript] 배열타입  (0) 2023.02.24
[typescript] 함수  (0) 2023.02.24
[typescript] 타입 기본  (0) 2023.02.24
[typescript] 기초 1-1(터미널 출력)  (0) 2023.02.16
[typescript] 타입스크립트 사이트, 설치, 컴파일 설정  (0) 2023.02.15

댓글