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
  • Interfaces
  • Classes can implement interfaces
  • TIPs
Edit on GitHub
  1. TypeScript's Type System

Interfaces

Interfaces

Інтерфейси мають zero вплив на час виконання JS. В інтерфейсах TypeScript є багато можливостей для оголошення структури змінних.

Наступні дві еквівалентні декларації, перша використовуєinline annotation, друга використовує interface:

// Sample A
declare var myPoint: { x: number; y: number; };

// Sample B
interface Point {
    x: number; y: number;
}
declare var myPoint: Point;

Однак принадність Sample B полягає в тому, що якщо хтось створює бібліотеку, яка будується на бібліотеці myPoint для додавання нових учасників, вони можуть легко додати до існуючої декларації myPoint:

// Lib a.d.ts
interface Point {
    x: number; y: number;
}
declare var myPoint: Point;

// Lib b.d.ts
interface Point {
    z: number;
}

// Your code
var myPoint.z; // Allowed!

Це тому, що interfaces in TypeScript are open ended. Це життєво важливий принцип TypeScript, який дозволяє вам імітувати розширюваність JavaScript за допомогою interfaces.

Classes can implement interfaces

Якщо ви хочете використовувати classes які повинні відповідати структурі об’єкта, яку хтось оголосив для вас в interface ви можете використати ключове слово implements для забезпечення сумісності:

interface Point {
    x: number; y: number;
}

class MyPoint implements Point {
    x: number; y: number; // Same as Point
}

По суті, за наявності цих implements, будь-які зміни в цьому зовнішньому інтерфейсі Point призведуть до помилки компіляції у вашій кодовій базі, тому ви можете легко підтримувати його в синхронізації:

interface Point {
    x: number; y: number;
    z: number; // New member
}

class MyPoint implements Point { // ERROR : missing member `z`
    x: number; y: number;
}

Зауважте, що implements обмежує структуру instances класу, тобто:

var foo: Point = new MyPoint();

І такі речі, як foo: Point = MyPoint, це не те саме.

TIPs

Not every interface is implementable easily

Інтерфейси призначені для оголошення any arbitrarily crazy структури, яка може бути присутня в JavaScript

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

interface Crazy {
    new (): {
        hello: number
    };
}

По суті, у вас буде щось на зразок:

class CrazyClass implements Crazy {
    constructor() {
        return { hello: 123 };
    }
}
// Because
const crazy = new CrazyClass(); // crazy would be {hello:123}

Ви можете декларувати всі божевільні JS з інтерфейсами та навіть безпечно використовувати їх із TypeScript. Це не означає, що ви можете використовувати класи TypeScript для їх реалізації.

PreviousVariablesNextEnums

Last updated 1 year ago