인프런 커뮤니티 질문&답변

바스니카님의 프로필 이미지
바스니카

작성한 질문수

[리뉴얼] 타입스크립트 올인원 : Part1. 기본 문법편

forEach 타입 직접 만들기

밑의 댓글 보고 질문드립니다.

작성

·

445

·

수정됨

0

https://www.inflearn.com/course/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%98%AC%EC%9D%B8%EC%9B%90-1/unit/122327?category=questionDetail&q=664606&tab=community

 

이 글 보고 질문드립니다.

interface myArray<T> {
  myForEach(callback: (v: T) => void): void;
}

const a: myArray<number> = [1, 2, 3] as myArray<number>; // 에러 발생
a.myForEach((v) => console.log(v));

 

이렇게만 작성할 경우, Property 'myForEach' is missing in type 'number[]' but required in type 'myArray<number>' 에러가 발생합니다.

 

  1. a의 타입을 myArray<number>로 지정했음에도 Array<number>를 참고하는 이유가 뭔가요?

     

  2. Array<number>를 참고하기 때문에 밑의 댓글에 interface myArray<T> extends Array<T> 로 적으셨던 건가요?

     

  3. 강의에서 forEach 메서드가 에러가 안났던 이유는 Array<T>에 이미 forEach 메서드가 있었기 때문인가요?

답변 1

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

  1. const a의 타입이 myArray<number>이지 [1, 2, 3]이 myArray<number>가 아니라서 그렇습니다.

  1. myArray extends Array를 하면 Array가 myArray의 부분집합이 되므로 as로 전환이 가능해집니다.

  2. forEach가 있는 경우는 myArray가 Array의 부분집합이 되므로 as로 전환이 가능해집니다.

바스니카님의 프로필 이미지
바스니카
질문자

  1. 자바스크립트의 extends와 다른건가요?

    myArray > Array라는 말씀이시죠?

  1. extends를 안 썼는데 Arr와 Array 관계를 어떻게 알 수 있나요? tsc가 암묵적으로 관계를 만드나요?

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

  1. 타입스크립트의 인터페이스인지라 extends는 js와 비교가 좀 어려울 것 같습니다.

  2. { forEach } 는 { forEach, fill, map, every, ...} (배열)의 부분집합입니다.

바스니카님의 프로필 이미지
바스니카
질문자

답변 감사합니다.

3에 대해 마지막으로 추가 질문드립니다.

interface myArray<T> {
  forEach(callback: (v: T) => void): void;
}

const a: myArray<number> = [1, 2, 3];
a.forEach((v) => console.log(v));

위와 같이 작성하면 에러가 안나는데,

아래와 같이 작성하면 에러가 납니다.

interface myArray<T> extends Array<T>{
  forEach(callback: (v: T) => void): void;
}

const a: myArray<number> = [1, 2, 3];
a.forEach((v) => console.log(v));

 

첫 번째 경우는 Array를 생략한 거고, 두 번째 경우는 Array를 적어준 건데 에러가 나는 이유가 궁금합니다.

에러의 내용은 아래와 같습니다.

Interface 'myArray<T>' incorrectly extends interface 'T[]'.
  Types of property 'forEach' are incompatible.
    Type '(callback: (v: T) => void) => void' is not assignable to type '(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any) => void'.
      Types of parameters 'callback' and 'callbackfn' are incompatible.ts(2430)
제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

에러메시지에 나온대로 매개변수 타입을 똑같이 만들어보세요

바스니카님의 프로필 이미지
바스니카

작성한 질문수

질문하기