이슈
탭 컴포넌트를 만들기 위해서 html을 ts파일에 import하여 사용하려는데, 타입선언을 해주라고 빨간 오류 줄이 생겼다. Ctrl + space를 눌러 HtmlEmbedElement 등 다른걸로 바꿔봤으나 그럼 밑에 있는 다른 소스들이 더 심하게 빨간 줄이 생겼다.
해결 InstanceType
import mappingList from 'mappingList html파일 경로';
import serviceList from 'serviceList html파일 경로';
type TabComponents = Record<tabKeys, InstanceType<typeof mappingList | typeof serviceList>>;
InstanceType을 아무리 찾아봐도 타입을 임의로 지정해준다라는 말 밖에 안나왔었는데 저걸 사용하면 된다고 한다.
아래는 단계별로 바꿔간 코드이다.
단계별 삽질기
[초기에 any로 다 지정해 놓은 상황]
import mappingList from 'mappingList html파일 경로';
import serviceList from 'serviceList html파일 경로';
type TabComponents = {
[key: string]: any;
mapping: any;
service: any;
}
1. InstanceType으로 타입선언을 바꿔주기. 그런데 [key: string]: 이자리에 any밖에 생각이 안남.
import mappingList from 'mappingList html파일 경로';
import serviceList from 'serviceList html파일 경로';
type TabComponents = {
[key: string]: any; //이부분이 ???? 물음표였다.
mapping: InstanceType<typeof mappingList>; //html파일은 이런식으로 타입선언
service: InstanceType<typeof serviceList>;
}
2. any타입을 바꿔주기위해 삽질하다가 InstanceType을 다시 사용하고 union type으로 선언해주기로 함.
import mappingList from 'mappingList html파일 경로';
import serviceList from 'serviceList html파일 경로';
type TabComponents = {
[key: string]: InstanceType<typeof mappingList | typeof serviceList> //이렇게 해결
mapping: InstanceType<typeof mappingList>; //html파일은 이런식으로 타입선언
service: InstanceType<typeof serviceList>;
}
3. 소스가 깔끔하지 않아 tabKeys를 밖으로 빼서 정리하였다.
import mappingList from 'mappingList html파일 경로';
import serviceList from 'serviceList html파일 경로';
type tabKeys = 'mapping' | 'service';
type TabComponents = {
[key in tabKeys]: InstanceType<typeof mappingList | typeof serviceList>;
}
4. 하지만 타입이 탭 메뉴라 2개로 고정되어있으므로 위에 소스를 Record를 사용하여 한줄로 정리할 수 있었다. (많으면 위에처럼, 1-2개로 적으면 아래처럼!)
import mappingList from 'mappingList html파일 경로';
import serviceList from 'serviceList html파일 경로';
type TabComponents = Record<tabKeys, InstanceType<typeof mappingList | typeof serviceList>>;
반응형
'Typescript' 카테고리의 다른 글
[typescript] 컴포넌트 간에 interface를 export하고 import 했는데 아무리해도 오류가 날때..! (0) | 2022.01.23 |
---|---|
[typescript] 타입선언은 대체 어디에 ? ? 타입이 똑같아도 모든파일에서 다 ? (컴포넌트간 타입선언 해보기) (0) | 2022.01.23 |
[typescript 기본] 타입스크립트의 모듈화 ( == es6 modules) + 예제 (0) | 2022.01.16 |
[typescript 기본] 타입호환 (함수/제네릭 예제) - 어디까지 어떻게 호환되나요 ? (0) | 2022.01.16 |
[typescript 기본] 타입가드 is와 타입단언 as (0) | 2022.01.16 |