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
  • Copying both the Type + Value
  • Capturing the type of a variable
  • Capturing the type of a class member
  • Capturing the type of magic strings
  • Capturing Key Names
Edit on GitHub
  1. TypeScript's Type System

Moving Types

Система типів TypeScript є надзвичайно потужною та дозволяє переміщувати та нарізати типи способами, неможливими в жодній іншій окремій мові.

Це пов’язано з тим, що TypeScript розроблено, щоб дозволити вам бездоганно працювати з highly dynamic мовою, такою як JavaScript. Тут ми розглянемо кілька прийомів для переміщення типів у TypeScript.

Основна мотивація для них: ви змінюєте щось одне, а все інше просто оновлюється автоматично, і ви отримуєте приємні помилки, якщо щось збирається зламатися, наприклад добре розроблена система обмежень.

Copying both the Type + Value

Якщо ви хочете перемістити клас, у вас може виникнути спокуса зробити наступне:

class Foo { }
var Bar = Foo;
var bar: Bar; // ERROR: cannot find name 'Bar'

Це помилка, оскільки var скопіював лише Foo в простір оголошення variable тому ви не можете використовувати Bar як анотацію типу. Правильним способом є використання ключового слова import. Зверніть увагу, що ви можете використовувати ключове слово import таким чином, лише якщо ви використовуєте namespaces або modules (докладніше про це пізніше):

namespace importing {
    export class Foo { }
}

import Bar = importing.Foo;
var bar: Bar; // Okay

Цей трюк import працює лише для речей, які є both type and variable.

Capturing the type of a variable

Ви можете використовувати змінну в анотації типу за допомогою оператора typeof. Це дозволяє повідомити компілятору, що одна змінна має той самий тип, що й інша. Ось приклад, щоб продемонструвати це:

var foo = 123;
var bar: typeof foo; // `bar` має тей самий тип як `foo` (`number`)
bar = 456; // Okay
bar = '789'; // ERROR: Тип `string` не співпадає з `number`

Capturing the type of a class member

Ви можете перейти до будь-якого типу об’єкта, який не допускає значення NULL, щоб отримати тип властивості:

class Foo {
  foo: number; // деякий член, тип якого ми хочемо захопити
}

let bar: Foo['foo']; // `bar` має тип `number`

Крім того, подібно до захоплення типу змінної, ви просто оголошуєте змінну виключно для цілей захоплення типу:

// Чисто для захоплення типу
declare let _foo: Foo;

// Те саме, що й раніше
let bar: typeof _foo.foo; // `bar` має тип `number`

Capturing the type of magic strings

Багато бібліотек і фреймворків JavaScript працюють на необроблених рядках JavaScript. Ви можете використовувати змінні const, щоб зафіксувати їх тип, наприклад.

// Зберіть *тип* і *значення* магічного рядка:
const foo = "Hello World";

// Использование типа:
let bar: typeof foo;

// bar можна призначати лише для `Hello World`

bar = "Hello World"; // Okay!
bar = "anything else "; // Error!

Capturing Key Names

Оператор keyof дозволяє фіксувати назви ключів типу. наприклад ви можете використовувати його для захоплення імен ключів змінної, спершу захопивши її тип за допомогою typeof:

const colors = {
  red: 'reddish',
  blue: 'bluish'
}
type Colors = keyof typeof colors;

let color: Colors; // теж саме let color: "red" | "blue"
color = 'red'; // okay
color = 'blue'; // okay
color = 'anythingElse'; // Error: тип '"anythingElse"' не співпадає з '"red" | "blue"'

Це дозволяє досить легко мати такі речі, як рядок enum + константи, як ви щойно бачили в прикладі вище.

PreviousIndex SignaturesNextException Handling

Last updated 1 year ago

У цьому прикладі bar має буквальний тип "Hello World". Ми докладніше розглядаємо це в .

literal type section