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
  • Ideal Fix
  • Quick Fix
  • Middle Ground
Edit on GitHub
  1. TIPs

Lazy Object Literal Initialization

Лінива ініціалізація літерального обʼєкту.

Досить часто в базах коду JavaScript ви ініціалізуєте літерали об’єктів наступним чином:

let foo = {};
foo.bar = 123;
foo.bas = "Hello World";

Щойно ви перемістите код у TypeScript, ви почнете отримувати такі помилки:

let foo = {};
foo.bar = 123; // Error: Властивість 'bar' не існує в обʼєкті '{}'
foo.bas = "Hello World"; // Error: Властивість 'bas' dне існує в обʼєкті '{}'

Це тому, що let foo = {}, TypeScript розуміє що тип foo (лівостороння ініціалізації призначення) також є типом виразу праворуч {} (це обʼєкт, який немає властивостей). Отже, виникає помилка, якщо ви намагаєтеся призначити властивість, про яку він не знає.

Ideal Fix

Ідеальний фікс.

Правильний спосіб ініціалізації об’єкта в TypeScript полягає в тому, щоб зробити це у призначенні:

let foo = {
    bar: 123,
    bas: "Hello World",
};

Це також чудово підходить для перевірки та підтримки коду.

The quick fix and middle ground lazy initialization patterns described below suffer from mistakenly forgetting to initialize a property.

Описані нижче шаблони швидкого виправлення та лінивої ініціалізації описані нижче виправляють припад коли помилково забувають ініціалізувати властивість

Quick Fix

Швидкий фікс.

Якщо у вас є велика база коду JavaScript, яку ви переносите на TypeScript, ідеальне виправлення може бути не життєздатним рішенням для вас. У цьому випадку ви можете обережно використовувати твердження типу, щоб заглушити компілятор:

let foo = {} as any;
foo.bar = 123;
foo.bas = "Hello World";

Middle Ground

Середній рівень.

Звичайноб викоростання any твердження може бути дуже поганим, оскільки воно порушує безпеку TypeScript. Золотий шлях — створити interface, щоб забезпечити

  • добру документацію

  • безпеку

Код нижче:

interface Foo {
    bar: number
    bas: string
}

let foo = {} as Foo;
foo.bar = 123;
foo.bas = "Hello World";

Ось короткий приклад, який показує, що використання інтерфейсу може допомогти:

interface Foo {
    bar: number
    bas: string
}

let foo = {} as Foo;
foo.bar = 123;
foo.bas = "Hello World";

// пізніше в коді:
foo.bar = 'Hello Stranger'; // Error: Можливо, ви неправильно написали `bas` як `bar`, не можете призначити рядок числу
PreviousType InstantiationNextClasses are Useful

Last updated 1 year ago