TypeScript Deep Dive
  • README
  • 시작하기
    • 왜 타입스크립트인가
  • 자바스크립트
    • 비교 연산자
    • 참조 연산자
    • Null vs. Undefined
    • this
    • 클로저
    • Number
    • Truthy
  • 미래의 자바스크립트
    • 클래스
      • 즉시실행함수
    • 화살표 함수
    • 나머지 연산자
    • let
    • const
    • 비구조화 할당
    • 전개 연산자
    • for...of
    • 이터레이터
    • 템플릿 리터럴
    • 프로미스
    • 제네레이터
    • Async Await
  • 프로젝트
    • 컴파일러 제어
      • tsconfig.json
      • 파일 경로 지정
    • 선언
    • 모듈화
      • 파일을 이용한 모듈화
      • globals.d.ts
    • 네임스페이스
    • 동적 표현식 가져오기
  • Node.js 시작하기
  • Browser 시작하기
  • 타입스크립트 타입 시스템
    • 자바스크립트 마이그레이션 가이드
    • @types
    • 주변 선언
      • 파일 선언
      • 변수
    • 인터페이스
    • 열거형(Enums)
    • lib.d.ts
    • 함수
    • 콜러블(Callable)
    • 타입 표명(Type Assertion)
    • 신선도(Freshness)
    • 타입 가드
    • 리터럴(Literal)
    • 읽기 전용(readonly)
    • 제네릭
    • 타입 인터페이스
    • 타입 호환성
    • Never 타입
    • 구별된 유니온
    • 인덱스 서명(Index Signature)
    • 타입 이동하기
    • 예외 처리
    • 믹스인(Mixin)
  • JSX
    • React
    • Non React JSX
  • Options
    • noImplicitAny
    • strictNullChecks
  • 타입스크립트 에러
    • 에러 메세지
    • 공통 에러
  • NPM
  • 테스트
    • Jest
    • Cypress
  • Tools
    • Prettier
    • Husky
    • ESLint
    • Changelog
  • 팁
    • 문자열 Enums
    • 타입 단언
    • 상태 저장 함수
    • 커링
    • 제네릭 타입 예시
    • 객체 타입 설정
    • 유용한 클래스
    • Import / Export
    • 속성 Setters
    • outFile 주의사항
    • 제이쿼리 팁
    • 정적 생성자
    • 싱글톤 패턴
    • 함수 파라미터
    • 토글 생성
    • Import 여러개 하기
    • 배열 생성
    • 생성자에서 타입정의
  • 스타일 가이드
  • 타입스크립트 컴파일러 구조
    • Program
    • AST
      • TIP: Visit Children
      • TIP: SyntaxKind enum
      • Trivia
    • Scanner
    • Parser
      • Parser Functions
    • Binder
      • Binder Functions
      • Binder Declarations
      • Binder Container
      • Binder SymbolTable
      • Binder Error Reporting
    • Checker
      • Checker Diagnostics
      • Checker Error Reporting
    • Emitter
      • Emitter Functions
      • Emitter SourceMaps
    • Contributing
Powered by GitBook
On this page
  • 발견성이 떨어짐
  • 자동완성
  • CommonJS 연동
  • 오타 방지
  • TypeScript 자동 임포트
  • 재익스포트
  • 동적 임포트
  • 클래스가 아닌 경우 / 함수가 아닌 경우 2줄 필요

Was this helpful?

  1. 팁

Import / Export

아래와 같은 내용으로 foo.ts 이란 파일이 있다고 생각해봅시다:

class Foo {
}
export default Foo;

이 내용은 아래처럼 ES6 구문으로 임포트할 수 있습니다 (bar.ts 모듈로):

import Foo from "./foo";

여기에는 유지보수 관점에서 몇가지 문제가 있습니다:

  • foo.ts 에서 Foo 를 리팩토링하더라도 bar.ts 파일의 이름은 바뀌지 않습니다.

  • foo.ts 에서 추가적인 내용을 익스포트해야 할 때 (많은 파일에서 이런 일이 발생할텐데) 임포트 구문을 가지고 씨름해야 합니다.

이런 이유 때문에 필자는 단순 익스포트 + 탈구조화된 임포트를 추천합니다, 예를 들어, foo.ts:

export class Foo {
}

그리고:

import { Foo } from "./foo";

아래에 몇가지 이유가 더 나와 있습니다.

발견성이 떨어짐

디폴트 익스포트를 사용하면 발견성이 매우 떨어집니다. 어떤 모듈에 디폴트 익스포트가 있는지 없는지 여부를 인텔리센스로 살펴볼 수도 없습니다.

디폴트 익스포트 방식이면 여기서 아무것도 알 수 없습니다 (디폴트 익스포트가 있을 수도 있고 / 아닐 수도 있음 ¯\_(ツ)_/¯):

import /* here */ from 'something';

디폴트 익스포트를 사용하지 않으면 인텔리센스가 잘 작동합니다:

import { /* here */ } from 'something';

자동완성

익스포트에 신경쓰지 않는다 해도 import {/*here*/} from "./foo"; 식의 코드는 커서를 올리면 자동 완성이 됩니다. 개발자들 손이 조금 편해지겠죠.

CommonJS 연동

default 를 쓴 경우, commonJS 사용자들은 const {Foo} = require('module/foo') 대신 const {default} = require('module/foo'); 를 써야하기 때문에 엄청 불편합니다. 이렇게 임포트하느니 차라리 default 를 다른 이름으로 바꾸고 싶어질 것입니다.

오타 방지

한 개발자는 import Foo from "./foo"; 로 하고 다른 개발자는 import foo from "./foo"; 로 하는 오타가 발생하지 않습니다.

TypeScript 자동 임포트

자동 임포트 빠른 수정(Quick Fix)이 더 잘 동작합니다. Foo 를 입력했을 때, 그 이름이 한 모듈에서 익스포트된 잘 정의된 이름이라면 자동 임포트가 import { Foo } from "./foo"; 를 추가해줍니다. 어떤 툴은 마법적으로 파일을 분석해서 디폴트 익스포트의 이름을 추론 해주기도 하는데, 마법은 불안하죠.

재익스포트

NPM 패키지의 루트 index 에서 재익스포트를 하는 경우가 많고, 이런 경우에는 디폴트 익스포트를 수동으로 바꿔줘야 합니다, 이렇게 export { default as Foo } from "./foo"; (디폴트 사용) vs. 이렇게 export * from "./foo" (이름 붙인 익스포트).

동적 임포트

디폴트 익스포트는 동적 import 일 때 default 라는 안 좋은 이름이 붙게 됩니다, 예를 들어:

const HighCharts = await import('https://code.highcharts.com/js/es-modules/masters/highcharts.src.js');
HighCharts.default.chart('container', { ... }); // `.default`가 붙음

이름 붙인 익스포트가 훨씬 보기 좋음:

const {HighCharts} = await import('https://code.highcharts.com/js/es-modules/masters/highcharts.src.js');
HighCharts.chart('container', { ... }); // `.default` 안 붙음

클래스가 아닌 경우 / 함수가 아닌 경우 2줄 필요

함수 / 클래스를 한 문장으로 처리, 예:

export default function foo() {
}

이름 없는 / 타입 붙은 객체를 한 문장으로 처리, 예:

export default {
  notAFunction: 'Yeah, I am not a function or a class',
  soWhat: 'The export is now *removed* from the declaration'
};

그외에는 두 문장 필요:

// 로컬에서 사용하기 위해 이름을 붙이거나 (여기서는 `foo`) 타입을 붙여야 할 경우 (여기서는 `Foo`)
const foo: Foo = {
  notAFunction: 'Yeah, I am not a function or a class',
  soWhat: 'The export is now *removed* from the declaration'
};
export default foo;
Previous유용한 클래스Next속성 Setters

Last updated 3 years ago

Was this helpful?