yamoo9 / likelion-FEQA

질문/답변 — 프론트엔드 스쿨, 멋사
29 stars 9 forks source link

[LAB-12] 'No overload matches this call' 에러가 왜 해결되었는지에 대해 #297

Closed sykang013 closed 1 year ago

sykang013 commented 1 year ago

질문 작성자

강수영

문제 상황(현재 해결된 상태입니다)

🐮 뒷걸음질치다 문제 해결... 근데 왜 되는걸까요

프로젝트 저장소 URL

환경 정보

yamoo9 commented 1 year ago

문제 원인

getFontStyle 함수에 지정된 return 타입이 잘못되었기 때문에 TypeScript는 오류 메시지를 출력한 것입니다. ITokens 타입인 tokens 객체의 fonts 속성의 하위 타입과 같은 타입을 명시해야 TypeScript는 오류라고 인식하지 않습니다.

문제 해결

@sykang013 님께서 "함수 리턴 값의 type 설정을 지워보니, 에러가 해결되었습니다."고 말씀주셨는데 그건 TypeScript가 함수의 반환 값을 추론(inference)할 수 있기 때문입니다.

TypeScript는 ITokens 타입을 통해 함수가 반환하는 값의 타입을 아래와 같이 추론 했고 그것이 올바른 타입입니다.

{
  [key: string]: string;
}

만약 함수의 반환 값 타입을 명시하고자 한다면 아래와 같이 작성 해보세요. 그러면 TypeScript는 오류를 출력하지 않고, 함수의 반환 값을 명시적으로 작성할 수 있을 것입니다. 😊

tokens.ts

export interface IFontTokens {
  [key: string]: string;
}

interface ITokens {
  fonts: {
    [key: string]: IFontTokens;
  };
}

utils.ts

import { tokens, IFontTokens } from './tokens';

export const getFontStyle = (fontStyleAndVariant: string): IFontTokens => {
  const fontStyles = fontStyleAndVariant;
  return tokens.fonts[fontStyles];
};