inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

forEach 타입 직접 만들기

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

505

바스니카

작성한 질문수 49

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 메서드가 있었기 때문인가요?

typescript

답변 1

1

제로초(조현영)

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

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

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

0

바스니카

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

    myArray > Array라는 말씀이시죠?

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

1

제로초(조현영)

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

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

0

바스니카

답변 감사합니다.

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)

1

제로초(조현영)

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

데코레이터가 현재도 자주 쓰이는 문법인가요?

0

81

2

유틸리티 타입 실제로 구현은 못해도 하나씩 외우면 실무할 때 지장 없겠죠?

0

66

1

매핑 타입은 type에서밖에 안된다고 하네요?

0

65

2

자바에서의 오버로딩과 같은 개념이라고 생각해도 되나요?

0

69

2

filter 함수 반환 타입 네로잉 질문

0

74

2

map<U>(callbackfn: ....) 할때 U는 왜 여기 있는거에요??

0

47

2

ts 컴파일을 위한 type 라벨링 부분

0

46

1

concat 함수 타입 구현 중 질문 있습니다!

0

100

2

filter 메소드 질문

0

53

1

forEach 제네릭 관련 문의

0

60

1

타입 추론 시 가장 넓은 범위로 추론이 되는 건가요?

0

165

1

enum이 javascript로 트랜스파일링될때 사라진다하셨는데요

0

207

1

함수 파라미터 타입 정의 시 ...args: any[]와 ...args: any 의 차이

0

223

1

Flat type에서 ReadonlyArray 타입을 사용하는 이유?

0

157

1

bind type 질문

1

149

1

Lowercase type 관련 질문

0

152

1

key-value 타입 자동추론 질문드립니다

0

266

1

타입스크립트 교과서, p131

0

266

1

타입스크립트 교과서 p122 forEach 메서드 질문

0

232

1

타입스크립트 교과서 p116 , 코드에러남

1

269

1

타입스크립트 교과서 p112 , 코드가 안읽힙니다..

0

266

1

타입스크립트 교과서 p83

1

184

1

타입스크립트교과서 p39 쪽 코드가 이해가 안되요

1

227

1

class 에서 ts의 private vs js의 private field( # )

0

339

1