typescript
GitHub
  • README
  • Давайте Почнемо
    • Why TypeScript
  • JavaScript
    • Equality
    • References
    • Null vs. Undefined
    • this
    • Closure
    • Number
    • Truthy
  • Future JavaScript Now
    • Classes
      • Classes Emit
    • Arrow Functions
    • Rest Parameters
    • let
    • const
    • Destructuring
    • Spread Operator
    • for...of
    • Iterators
    • Template Strings
    • Promise
    • Generators
    • Async Await
  • Проект / Project
    • Контекст компіляції / Compilation Context
      • tsconfig.json
      • Які файли / Which Files?
    • Простори Оголошень / Declaration Spaces
    • Модулі / Modules
      • File Module Details
      • global.d.ts
    • Namespaces
    • Dynamic Import Expressions
  • Node.js QuickStart
  • Browser QuickStart
  • Library QuickStart
  • TypeScript's Type System
    • JS Migration Guide
    • @types
    • Ambient Declarations
      • Declaration Files
      • Variables
    • Interfaces
    • Enums
    • lib.d.ts
    • Functions
    • Callable
    • Type Assertion
    • Freshness
    • Type Guard
    • Literal Types
    • Readonly
    • Generics
    • Type Inference
    • Type Compatibility
    • Never Type
    • Discriminated Unions
    • Index Signatures
    • Moving Types
    • Exception Handling
    • Mixins
  • JSX
    • React
    • Non React JSX
  • Options
    • noImplicitAny
    • strictNullChecks
  • Errors in TypeScript
    • Interpreting Errors
    • Common Errors
  • NPM
  • Testing
    • Jest
    • Cypress
  • Tools
    • Prettier
    • Husky
    • ESLint
    • Changelog
  • TIPs
    • String Based Enums
    • Nominal Typing
    • Stateful Functions
    • Currying
    • Type Instantiation
    • Lazy Object Literal Initialization
    • Classes are Useful
    • Avoid Export Default
    • Limit Property Setters
    • outFile caution
    • JQuery tips
    • static constructors
    • singleton pattern
    • Function parameters
    • Build Toggles
    • Barrel
    • Create Arrays
    • Typesafe Event Emitter
  • StyleGuide
  • TypeScript Compiler Internals
    • 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
  • Poor Discoverability
  • Autocomplete
  • CommonJS interop
  • Typo Protection
  • TypeScript auto-import
  • Re-exporting
  • Dynamic Imports
  • Needs two lines for non-class / non-function
Edit on GitHub
  1. TIPs

Avoid Export Default

Недолікі export default

Вважайте, що у вас є файл foo.ts з контентом:

class Foo {
}
export default Foo;

Ви імпортуєте його (in bar.ts) з допомогою синтаксису ES6:

import Foo from "./foo";

Маємо декілька проблем:

  • Якщо ви змінюєте Foo в foo.ts це не буде зміненно в bar.ts.

  • Якщо вам знадобиться експортувати більше речей із foo.ts (це те, що буде у багатьох ваших файлів), тоді вам доведеться жонглювати синтаксисом імпорту.

Тому я рекомендую легкий імпорт + деструктурований імпорт. Наприклад foo.ts:

export class Foo {
}

Далі:

import { Foo } from "./foo";

Нижче наведени інши причини.

Poor Discoverability

Погана наочність.

Для експорту за замовченням притаманна дуже низька наочність. Вы не можете исследовать модуль с помощью IntelliSense, чтобы узнать, есть ли у него экспорт по умолчанию или нет.

З експортом за замовчуванням ви нічого тут не отримаєте (можливо, він експортує за замовчуванням / можливо, ні ¯\_(ツ)_/¯):

import /* here */ from 'something';

Без експорту за замовчуванням ви отримуєте гарну підказку:

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

Autocomplete

Автодоповнення.

Незалежно від того, чи знаєте ви про експорт, ви навіть виконуєте автозаповнення import {/*here*/} from "./foo"; в місці курсору. Надає вашим розробникам трохи полегшення для рук.

CommonJS interop

З default є жахливий досвід для користувачів звичайного JS, яким доводиться const {default} = require('module/foo'); замість const {Foo} = require('module/foo'). Швидше за все, ви захочете перейменувати експорт default на щось інше під час його імпорту.

Typo Protection

Захист типів.

Ви не отримаєте помилок, наприклад, коли один розробник виконує import Foo from "./foo";, а інший виконує import foo from "./foo";

TypeScript auto-import

AШвидке виправлення автоматичного імпорту працює краще. Ви використовуєте Foo, і автоматичний імпорт запише import { Foo } з "./foo";, оскільки це чітко визначене ім’я, експортоване з модуля. Деякі інструменти намагаються магічно прочитати та вивести ім’я для експорту за замовчуванням, але магія нестійка.

Re-exporting

Реекспортінг.

Повторний експорт є звичайним для кореневого файлу index в пакетах npm і змушує вас вручну назвати експорт за замовчуванням, наприклад, export { default as Foo } from "./foo"; (із замовчуванням) проти export * from "./foo" (з названими експортами).

Dynamic Imports

Динамічний імпорт.

Експорт за замовчуванням викриває себе погано названим default у динамічному import, наприклад.

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

Набагато краще так:

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

Needs two lines for non-class / non-function

Потрібні два рядки для не-класу/не-функції.

Може бути одним оператором для функції/класу, наприклад:

export default function foo() {
}

Може бути одним оператором для non named / type annotated об’єктів, наприклад.

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;
PreviousClasses are UsefulNextLimit Property Setters

Last updated 1 year ago