jtwjs Dev Wiki
  • DEV_ROAD
    • 💪🏻 생존하기
    • Week 1
      • 개발 환경 세팅
      • 타입스크립트
      • 리엑트
      • Testing Library
      • Parcel & ESLint
    • Week 2
      • JSX
      • Virtual DOM
    • Week 3
      • React Component
      • React State
    • Week 4
      • Express
      • Fetch API & CORS
      • React Hook
      • useRef & Custom Hook
    • Week 5
      • TDD
      • React Testing Library
      • MSW
      • Playwrite
      • Snapshot
    • Week 6
      • Separtion of Concerns
      • Principle
      • DI, (Dependency Injection)
      • Reflect-metadata
      • TSyringe
      • External Store
      • Follow Redux
      • usestore-ts
      • useSyncExternalStore
    • Week 7
      • Routing
      • Routes
      • Router
      • Navigation
    • Week 8
      • Design System
      • Style Basics
      • CSS-in-JS
      • Styled-Components
      • Global Style & Theme
    • Week 9
      • 개발하기 전 준비
      • 상품 목록 페이지
      • 상품 상세 페이지
      • 장바구니 페이지
    • Week 10
      • 로그인
      • 로그아웃
      • 회원가입
      • 주문 목록 & 주문 상세
    • Week 11
      • 배송 정보 입력
      • 포트원 결제 요청
      • 배송 및 결제 정보 전달
    • Week 12
      • 관리자 웹사이트개발시작
  • DEV_NOTE
    • TypeScript
      • 기본적 문법
        • Enum
        • 다형성
          • Untitled
        • 구조적 타이핑
        • 제너릭 타입
        • 컨디셔널 타입
        • 함수 메서드 타이핑
        • infer로 타입스크립트의 추론 직접 활용
        • 재귀 타입
        • 템플릿 리터럴 타입
        • 추가적인 타입 검사 satisfies 연산자
        • 타입스크립트 건망증
        • 원시 자료형에도 브랜딩 기법 사용 가능
        • 타입 좁히기
        • 유용한 타입 만들기
        • 데코레이터 함수
        • 앰비언트 선언도 선언 병합이 된다.
        • 앰비언트 선언도 선언병합이 된다.
    • Testing
      • Unit Testing
      • 단위 테스트의 두 분파
      • 좋은 단위 테스트를 구성하는 4대 요소
      • 테스트 대역과 식별할 수 있는 동작
      • 단위 테스트 스타일
      • 가치 있는 단위 테스트를 위한 리팩토링
      • 통합 테스트
      • Cross Browsing Testing
      • 기능 테스트 종류
      • React Testing Pattern
      • 프론트엔드 테스트 입문
        • 테스트 범위
        • 단위 테스트 검증
        • Mock
        • UI 컴포넌트 테스트
        • 테스트 커버리지
        • 웹 통합 테스트
        • MSW
        • 스토리북
        • 시각적 회귀 테스트
        • E2E 테스트
        • Github Actions 설정
        • 깃허브 액션에서 E2E
      • 시프트 레프트
        • 테스트 기본중의 기본
        • 단위 테스트
        • 코드 복잡도
        • 리팩터링
        • 코드 리뷰
        • 통합 테스트 패턴
        • 시스템 테스트의 자동화
        • 탐색적 테스트
      • Test Tip
      • vitest
      • playwright
      • Test Data Generator
      • MSW
    • Algorithm
      • coding test
      • Data Structure
    • Next.js
      • Data Fetching
      • Hydration
      • Next 13
      • Optimization
      • Next 15
    • Tailwind
      • Tailwind CSS
      • Theme
      • Directives
      • Tool
      • Design System
    • Storybook
      • Storybook
      • CSF3
      • CDD
      • Headless Component
    • Funtional Programming
      • 함수형 프로그래밍
      • 참조 투명성
      • 부수효과
      • 함수 합성
      • 제너릭 타입 활용하기
      • 암묵적 입출력
      • 액션과 계산, 데이터
      • 계층형 설계
      • 호출 그래프
      • 함수형 설계
      • 불변성
      • 일급 함수
      • 함수형 도구
    • Git
      • Github Actions
      • Conflict
      • Branch 전략
    • Contents Format
      • Audio
    • 3D Graphic
      • 3D keyword
      • Three.js
      • Geometry
      • Material
      • Light
      • Camera
      • Decal
      • Rotation
      • Text
      • Shadow
      • Fog
      • Post Processing
      • Animation
      • Math
        • Vector Space
        • 벡터의 연산
        • 회전 계산
      • 3D 컨텐츠가 만들어지는 과정
      • R3F
      • Env
      • Scene
      • Transform
      • R3F
      • Interaction & Raycast
      • Rendering Algorithnm
      • Blender
      • Blender
    • Accessibility
      • 접근성이란
    • Interactive Web
      • Parallax
      • Canvas
      • requestAnimationFrame
      • Effect
      • HSL
      • React.js + Canvas
      • Matter.js
    • AWS
      • DevOps
      • Amplify
      • S3
      • 클라우드 컴퓨팅
        • 온프레미스와 클라우드
        • 클라우드 도입효과
        • 클라우드 컴퓨팅의 범위
        • 컴퓨팅 옵션
          • EC2 - Virtual Machin
          • ECS, EKS - Container
          • Lambda - Serverless
        • 네트워크 가상화
        • 스토리지
        • 데이터베이스
        • 데이터 수집
        • 머신 러닝 영역
        • IoT 영역
        • 블록체인 영역
      • 클라우드 아키텍처 설계
    • Network
      • Web Server & WAS
    • System Design
      • System Design
      • Component
      • 의존성을 배제한 개발
      • Error Handling
      • Architecture
        • 모노로틱 아키텍처
        • Clean Architecture
        • Layered Architecture
        • 이벤트 기반 아키텍처
      • 상황을 파악하는 메타인지
      • 중복 문제 해결하기
      • Monorepo Arhitecture
        • 모노레포 운영과 트러블슈팅
        • Module Federation
      • 코드 병목지점
      • API 대응
      • 공통 코드
      • Infra 구축
      • 모듈 기반의 개발 방식
      • Design System
        • 최소 수준의 아키텍처 설정
        • 더 효율적인 디자인시스템 만들기
        • 디자인 시스템과 UI 라이브러리 목적
        • 디자인 토큰
      • 효율적인 업무
        • 업무 프로세스 병목 파악
      • Clean Code
      • Design Pattern
        • CQRS Pattern
        • Strangler Fig Pattern
        • 데코레이터 패턴
        • 커맨드 패턴
        • 전략 패턴
        • 옵저버 패턴
      • A/B 테스팅
      • 대규모 리엑트 웹앱 개발
        • 복잡성 관리
        • 모듈성
        • 성능
        • 디자인 시스템
        • 데이터 패칭
        • 상태 관리
        • 국제화
        • 코드 조직화하기
        • 개인화 A/B 테스팅
        • 확장 가능한 웹 아키텍처
        • 테스팅
        • 툴링
        • 기술적 마이그레이션
        • 타입스크립트
        • 라우팅
        • 사용자 중심 API 디자인
        • 리액트 미래
    • Performance
      • React DevTools
      • Component 최적화
      • Page Load
      • API
    • MFA
      • MSA
      • MFA 도입하기
      • Monorepo
        • Monorepo Tool
        • Yarn Berry Workspace
        • Turborepo
      • MFA Composition
      • SPA 통합
      • Design System
      • Package Manager
        • Yarn
        • pnpm
      • Transpiler & Bundler
        • Babel
        • Rollup
        • esbuild
        • swc
        • Webpack
        • Vite
      • 분해와 통합을 위한 여러 기술 비교
    • State Management
      • Zustand
    • React v18
      • Automatic batching
      • Suspense
      • Transition
    • SEO
      • Search Engine Optimization
      • Open Graph Element
      • Metadata
    • FE Develop
      • Scrubbing
      • Clipboard
    • Refactoring
      • 리팩토링 깊게 들여다보기
      • 긴 코드 조각내기
      • 타입 코드 처리하기
      • 유사한 코드 융합하기
      • 데이터 보호
      • 코드 추가 및 제거
    • OAuth 2.0
    • Analytics
      • Mixpanel
    • ETC
      • VSCode
    • React Hook In Action
      • useContext & Provider
      • 커스텀 훅
      • 코드 분할하기 with Suspense, lazy
      • Suspense와 이미지 적재하기
      • useTransition, uesDeferredValue
      • SuspenseList
Powered by GitBook
On this page
  • 함수 및 메서드 타이핑
  • 나머지 매개변수 문법
  • 함수 내부에서 this를 사용할 때
  • 같은 이름의 함수를 여러번 선언
  • 콜백 함수의 매개변수는 생략 가능
  • 공변성과 반공변성
  1. DEV_NOTE
  2. TypeScript
  3. 기본적 문법

함수 메서드 타이핑

함수 및 메서드 타이핑

함수의 매개변수를 타이핑하기 위한 다양한 문법이 존재

나머지 매개변수 문법

  • 나머지 매개변수 문법을 사용하는 매개변수는 항상 배열이나 튜플타입이어야 한다.

  • 매개변수의 마지막 자리에만 위치해야함 (...a: sring[], b: number)❌

function example(...args: [number, string, boolean]) {}
example(1, '2', false);

// 각 매개변수에 임의의 이름을 지정하고 싶다면 아래처럼
function example2(...args: [a: number, b: string, c:boolean]) {}

함수 내부에서 this를 사용할 때

function example() {
  console.log(this); // this: any
}

function exampl2(this: Window) {
  console.log(this); // this: Window
}

function example3(this: Document, a: string, b: 'this') {}
example3.call(document, 'hello', 'this');
  • this의 타입은 매개변수의 첫 번째 자리에 표기해야 한다.

  • ‼️ 타입스크립트에서 매개변수 자리에 존재하는 this는 실제 매개변수가 아니다.

  • this에 타입을 표기했다고 해서 this를 쓸 수 있는게 아닌 this 바인딩 기법을 통해 (call, bind 등)으로 this의 값을 명시적으로 지정해주어야 한다.

  • (클래스, 객체) 메서드의 경우 일반적으로 this는 메서드를 갖고 있는 객체 자신으로 추론되기 때문에 명시적으로 작성하지 않아도 된다.

같은 이름의 함수를 여러번 선언

TS는 매개변수에 어떤 타입과 값이 들어올지 미리 타입을 선언해야 한다.

오버로딩 (overloading)

  • 호출할 수 있는 함수의 타입을 미리 여러개 타이핑해두는 기법

  • 너무 지나치게 오버로딩을 활용하면 안됨 (애초에 오버로딩 할 필요가 없는 경우는 사용 ❌)

  • 유니온이나 옵셔널 매개변수를 활용할 수 있는 경우는 오버로딩을 사용하지 말자.

// 타입만 있고 함수의 구현부는 없음
function add(x: number, y: number): number
function add(x: string, y: string): string
// any를 명시적으로 사용한 처음이자 마지막인 사례
// any를 제거하면 implictAny 에러가 발생하여 쩔수없이 넣을수밖에
// any로 지정한다고 해서 x,y가 any가 되는것은 아님, 오버로딩한 타입의 조합만 가능
function add(x: any, y: any) {
  return x + y;
}

add(1, 2); // 3
add('1', '2'); // 12
add(1, '2'); // error
add('1', 2); // error
  • 오버로딩을 선언하는 순서도 타입 추론에 영향을 미침

  • 여러 오버로딩에 동시에 해당될 수 있는 경우는 제일 먼저 선언된 오버로딩에 해당됨

  • 오버로딩의 순서는 좁은 타입으로부터 넓은 타입순으로 오게 해야 문제가 없다.

  • 타입스크립트는 함수에 오버로딩이 있을 때 위에서부터 순서대로 검사한다.

function example(param: string): string;
function example(param: string | null): number
function example(param: string | null): string | number {
  if (param) {
    return 'string';
  } else {
    return 123;
  }
}

const result = example('what'); // result: string
  • 타입 별칭으로도 오버로딩 표현 가능

// interface
interface Add {
  (x: number, y: number): number;
  (x: string, y: string): string;
}
const add: Add = (x: any, y: any) => x + y;

type Add1 = (x: number, y: number) => number;
type Add2 = (x: string, y: string) => string;
type Add = Add1 & Add2;
const add: Add = (x: any, y: any) => x + y;

add(1, 2); //3
add('1', '2'); //12
add(1, '2'); //error
add('1', 2); //error

콜백 함수의 매개변수는 생략 가능

  • 인수로 제공하는 콜백 함수의 매개변수에는 타입을 표기하지 않아도 된다.

    • 함수를 선언할 때 매개변수로로 넘길 콜백함수의 타입을 표기했기 때문에 추론이 된다.

    • 이를 문맥적 추론(Contextual Typing) 이라 한다.

  • 콜백함수의 매개변수는 함수를 호출할 때 사용하지 않아도 된다.

    • 사용하지 않는다고 해서 옵셔널로 만들면 값이 | undefined로 추론되기에 의도와 달라진다.

    • forEach메서드가 딱 이 형태

  • 콜백 함수의 반환값이 void 인 경우 어떠한 반환값이 와도 상관없다. (즉, 타입에러가 나지 않음)

    • 다만 해당 반환값은 다른 곳에 사용되지 않음

function example(callback: (err: Error, result: string) => void) {}
example((e, r) => {});
example(() => {});
example(() => true);

공변성과 반공변성

공변성과 반공변성을 알아야 함수끼리 대입할 수 있다.

  • 어떤 함수는 다른 함수에 대입할 수 있고, 어떤 함수는 대입할 수 없다.

    • 이를 이해하려면 공변성과 반공변성 개념을 먼저 알아야함

  • A -> B 즉, A는 B에 대입할 수 있다.

  • 공변성: A -> B 일 때 T<A> -> T<B> 인 경우

  • 반공변성: A -> B 일 때 T<B> -> T<A> 인 경우

  • 이변성: A -> B 일 때 T<A> -> T<B> 도 되고 T<B> -> T<A> 도 되는 경우

  • 무공변성: A -> B 일 때 T<A> -> T<B> 도 안 되고 T<B> -> T<A>도 안 되는 경우\

  • 기본적으로 타입스크립트는 공변성을 가지고 있다.

  • 단, 함수의 매개변수는 반공변성 (넓 -> 좁)특징을 갖는다.

    • TS Config 메뉴에서 strictFunctionTypes 옵션이 체크되있어야함

    • strict 옵션이 체크되어있으면 자동 활성화

    • strictFunctionTypes 모두 체크되어있지 않다면 타입스크립트는 매개변수에 이변성을 갖는다.

  • 반환값은 무조건 항상 공변성 (좁 -> 넓)을 갖는다.

  • 단, 함수(매개변수): 반환값 으로 선언한 것은 매개변수가 이변성을 가짐

    • 함수: (매개변수) ⇒ 반환값으로 선언한 것은 반공변성을 가진다.

// a -> b, 좁은 타입에서 넓은 타입으로 대입할 수 있는 
function a(x: string): number { return 0 } // 더 좁은 타입

type B = (x: string) => string | number; // 더 넓은 타입
let b: B = a; 
function a(x: string | number): number { return 0 }
type B = (x: string) => number
let b: B = a; // 매개변수는 반공변성이므로 넓은 타입에서 -> 좁은 타입으로 대입 가능
Previous컨디셔널 타입Nextinfer로 타입스크립트의 추론 직접 활용

Last updated 5 months ago