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
Edit on GitHub
  1. TIPs

Type Instantiation

PreviousCurryingNextLazy Object Literal Initialization

Last updated 1 year ago

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

class Foo<T>{
	foo: T;
}

Ви хочете створити для нього спеціалізовану версію для певного типу. Шаблон полягає в тому, щоб скопіювати елемент у нову змінну та надати йому анотацію типу із заміною узагальнених типів на конкретні типи. наприклад якщо вам потрібен клас Foo<number>:

class Foo<T>{
	foo: T;
}
let FooNumber = Foo as { new ():Foo<number> }; // ref 1

У посиланні 1 ви говорите, що FooNumber — це те саме, що Foo, але розглядаєте його як щось, що при виклику оператора new дає екземпляр Foo<Number>.

Inheritance

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

class FooNumber extends Foo<number>{}

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

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

function id<T>(x: T) { return x; }
const idNum = id as {(x:number):number};

Натхненний цим

питанням stackoverflow