inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

한 입 크기로 잘라먹는 타입스크립트(TypeScript)

인터페이스

인터페이스 관련 질문입니다!

363

eko09

작성한 질문수 17

0

interface Person {
  name: string;
  age: number;
  sayHi(): void;
  // 오버로딩
  sayHi(a: number, b: number): void;
}

const person: Person = {
  name: "name",
  age: 1,
  sayHi(a?: number, b?: number) {
    if (a && b) {
      console.log("hi" + a + b);
    } else {
      console.log("No paramete");
    }
  },
}

해당 코드를 sayHi 메소드에 파라미터가 없으면 void를 return 하고 2개이면 number 를 return하게 만들고싶을땐 어떤식으로 해야할까요?

 

interface Person {
  name: string;
  age: number;
  sayHi(): void;
  // 오버로딩
  sayHi(a: number, b: number): number;
}

const person: Person = {
  name: "name",
  age: 1,
  sayHi(a?: number, b?: number) {
    if (a && b) {
      console.log("hi" + a + b);
        return a+b ;
    } else {
      console.log("No parameter");
    }
  },
}

이런식으로 했더니 오류가 생기더라고요 ㅜㅜ

typescript

답변 2

0

이정환 Winterlood

안녕하세요 이정환입니다.

AI 인턴이 좋은 답을 해 주었네요

저도 몇자 달아보자면 구현시그니쳐의 반환값 타입을 any 타입으로 정의해서도 해결하실 수 있습니다.

interface Person {
  name: string;
  age: number;
  sayHi(): void;
  sayHi(a: number, b: number): number;
}

const person: Person = {
  name: "name",
  age: 1,
  sayHi(a?: number, b?: number): any {
    if (a && b) {
      console.log("hi" + a + b);
      return a + b;
    } else {
      console.log("No parameter");
    }
  },
};

const a = person.sayHi();
// void 타입으로 추론 됨

const b = person.sayHi(1, 2);
// number  타입으로 추론 됨

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴이에요.

인터페이스에서 오버로딩을 사용하여 파라미터에 따라 다른 타입을 반환하도록 하는 것은 불가능합니다. 인터페이스에서는 함수 시그니처를 정의할 수는 있지만, 구현부에서는 오버로딩이 불가능하기 때문입니다.

대신에, 클래스를 사용하여 원하시는 기능을 구현하실 수 있어요. 아래는 클래스를 사용한 예시입니다.

interface Person {
  name: string;
  age: number;
  sayHi(): void;
}

class PersonImpl implements Person {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  sayHi(): void;
  sayHi(a: number, b: number): number;
  sayHi(a?: number, b?: number): void | number {
    if (a && b) {
      console.log("hi" + a + b);
      return a + b;
    } else {
      console.log("No parameter");
    }
  }
}

const person: Person = new PersonImpl("name", 1);
person.sayHi();
person.sayHi(2, 3);

위의 예시에서는 클래스를 사용하여 인터페이스 Person을 구현하고, sayHi 메소드를 오버로딩하였습니다. 이렇게 하면 파라미터에 따라 다른 동작을 수행할 수 있고, 반환 타입도 다르게 정의할 수 있습니다.

이 방법을 사용하면 원하시는 기능을 구현하실 수 있을 거에요. 참고로, 오버로딩을 사용하기 위해서는 클래스의 메소드 시그니처를 선언하고, 구현부에서는 오버로딩된 메소드들을 오버라이딩하는 방식으로 작성해야 합니다.

추가적인 질문이 있다면 언제든지 물어보세요!

핸드북 light/dark mode 관련 이슈가 있는 것 같습니다.

0

20

1

제네릭 클래스 핸드북 페이지가 undefined라고 나옵니다.

0

30

2

적절한 타입 찾기 React.ChangeEvent<HTMLInputElemen>

0

36

2

outDir 옵션 추가 후 컴파일 오류 질문

0

80

1

호출 시그니처 질문

0

72

2

서로소 유니언 타입이 discriminated union과 동의어 인가요?

0

84

2

조건부타입소개 중 함수오버로딩 활용 시 인수의타입과 함수의 반환값의 타입이 깨지는 문제

0

72

1

할인쿠폰 관련하여

0

168

2

프론트엔드에서의 인터페이스활용

0

100

2

안녕하세요 이정환님!

0

97

1

Node.js 설치에 관한 질문입니다.

0

82

2

함수 타입 호출 시그니처

0

63

1

35강. 모듈 보강은 라이브러리 파일을 직접 편집해야 하나요?

0

70

2

인터페이스 문법이 있는데 타입 별칭 문법은 왜 있나요?

0

122

4

마우스 호버 시 정보

0

98

2

vite으로 리액트 빌드하기를 업데이트해주세요.

1

92

2

타입가드를 만들어 사용하는 이유가 궁금합니다.

0

89

2

섹션 12가 너무 어려운데... 정상이겠죠..?

0

142

2

선생님.. 알고리즘도 강의해주시면안되나요

0

105

2

선생님은 어떻게 이런걸 아세요?

0

137

1

type: module

0

102

2

7:17초 업캐스팅 질문이있습니다!

0

84

1

슈퍼타입질문

1

70

2

프로젝트 설치

0

116

2