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

양진영님의 프로필 이미지
양진영

작성한 질문수

타입스크립트의 모든 것

decorator

제네릭 extends관련질문 있습니다.

작성

·

254

0

 function test<T extends object>(params:T){ params.hi()}

위 코드에서 params.hi()는 타입을 보장할수 없다는 에러가 반환됩니다. 여기서 궁금한게 test<T extends object>를 해주었는데 왜 타입보장이 안된다구 하는지 모르겠습니다. 물론 hi의 타입을 몰른다 라구 하더라도 object 프로퍼티에 접근할때 dot으로 접근할수있는데 왜 타입 보장이 안된다고 하는걸까요??

왜 따로 interface IHi를 만들어서 그거를 extends해줘야 하는것일까요?? 물론 IHi하면 타입을 좀더 촘촘하게 설정해주어서 params안에는 hi라는 메소드가 들어간다는걸 인지시켜줄순 있겠지만 그래도 오브젝트가 사용될수 없는 이유는 모르겠습니다.

답변 1

0

yongsoocho님의 프로필 이미지
yongsoocho
지식공유자

질문주셔서 감사합니다 :)

object는 객체일 뿐 어떠한 프로퍼티, 메서드도 보장하지 않습니다.

interface ITest {
  hello: any
}

test<ITest extends object>

예를 들어서 위와같이 타입을 적으면 hi가 없다는 것을 알 수 있습니다.
이는 협업에서도 마찬가지입니다.

작성자 분께서만 알고 있을 뿐, 같이 일하는 동료가 test<T extends object>를 보면서 test.hi( )를 유추할 수는 없습니다.

제가 클래스로 대입해서 설명을 하자면,

class ObjectTest {}

class Test extends ObjectTest {}

const test = new Test();
test.hi();

예를 들자면 위와 같은 상황인데 hi()가 있는 인터페이스를 상속해야만 100% 보장된다는 것을 아셔야합니다.

타입스크립트 엔진 자체가 100% 보장되는 것을 추구한다고 생각하면 편합니다.
뒤에서 배우시겠지만 타입가드를 통해서 100% 타입을 보장해서 써야만 오류가 안납니다.

양진영님의 프로필 이미지
양진영

작성한 질문수

질문하기