Typescript: рдЕрдиреБрд░реЛрдз: рдХреНрд▓рд╛рд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рдореНрдпреВрдЯреЗрд╢рди

рдХреЛ рдирд┐рд░реНрдорд┐рдд 20 рд╕рд┐рддре░ 2015  ┬╖  231рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: microsoft/TypeScript

рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдареАрдХ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ-рдореБрдХреНрдд рдорд┐рд╢реНрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕рдорд░реНрдерди рд╣реЛрдЧрд╛:

declare function Blah<T>(target: T): T & {foo: number}

<strong i="6">@Blah</strong>
class Foo {
    bar() {
        return this.foo; // Property 'foo' does not exist on type 'Foo'
    }
}

new Foo().foo; // Property 'foo' does not exist on type 'Foo'
Needs Proposal Suggestion

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛:

class Foo {
  <strong i="6">@async</strong>
  bar(x: number) {
    return x || Promise.resolve(...);
  }
}

рдПрд╕рд┐рдВрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ Promise<any> рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рднреА 231 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛:

class Foo {
  <strong i="6">@async</strong>
  bar(x: number) {
    return x || Promise.resolve(...);
  }
}

рдПрд╕рд┐рдВрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ Promise<any> рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

@ рдЧреЗрд▓рди , рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдЪрд╛рд╣рд┐рдП! рдпрд╣ рдорд┐рд╢реНрд░рдг рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдмрдирд╛ рджреЗрдЧрд╛ред

class asPersistent {
  id: number;
  version: number;
  sync(): Promise<DriverResponse> { ... }
  ...
}

function PersistThrough<T>(driver: { new(): Driver }): (t: T) => T & asPersistent {
  return (target: T): T & asPersistent {
    Persistent.call(target.prototype, driver);
    return target;
  }
}

@PersistThrough(MyDBDriver)
Article extends TextNode {
  title: string;
}

var article = new Article();
article.title = 'blah';

article.sync() // Property 'sync' does not exist on type 'Article'

рдЗрд╕рдХреЗ рд▓рд┐рдП +1ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдбреЗрдХреЛрд░реЗрдЯрд░ рдореНрдпреВрдЯреЗрд╢рди рд╕реЗрдореЗрдиреНрдЯрд┐рдХреНрд╕ рдкрд░ рдПрдХ рд╕рдордЭреМрддреЗ рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рдХрдард┐рди рд╣реИред

+1

рдпрджрд┐ рдЗрд╕рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХ рд▓рд╛рдн рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рд▓рдп рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

interface Foo { foo(): number }
class Foo {
    bar() {
        return this.foo();
    }
}

Foo.prototype.foo = function() { return 10; }

new Foo().foo();

рдпрджрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдп рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрдХрд▓рдХ рдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдХрдХреНрд╖рд╛ рдХреЛ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд┐рдд рднрд╛рд╖рд╛, IMHO рдореЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдЪреАрдЬрд╝ рдХреА рддрд░рд╣ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

@masaeedu рдХреНрдпрд╛ рдЖрдк рд╕рдЬрд╛рдП рдЧрдП рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рд╕рджрд╕реНрдп рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХрд╛рдордХрд╛рдЬ рдЬрд╛рдирддреЗ рд╣реИрдВ?

@davojan рдЬрд╝рд░реВрд░ред рд╣реЗрдпрд░ рдпреВ рдЧреЛ:

class A { }
namespace A {
    export let foo = function() { console.log("foo"); }
}
A.foo();

рдХрд┐рд╕реА рд╡рд┐рдзрд┐ рдХреЛ рд╕рдЬрд╛рддреЗ рд╕рдордп рдХрдХреНрд╖рд╛ рдореЗрдВ _multiple_ рдЧреБрдгреЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд╣рд╛рдпрдХ рдЬреЛ рдЧреЗрдЯрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдмрджреНрдз рд╕реЗрдЯрд░ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдЙрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ)

connect рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░рд┐рдбрдХреНрд╕ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдПрдХ рдШрдЯрдХ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рдШрдЯрдХ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдкреНрд░реЛрдк рдореЗрдВ рд░реЗрдбрдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрдиреЗрдХреНрдЯреЗрдб рдкреНрд░реЛрдк рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯреАрдПрд╕ рдЙрдирдХреА connect рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдирд╣реАрдВ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдХрд╛рд░рдг рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ред рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдЙрдкрд╛рдп рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ClassDecorator рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрд╣ declare type ClassDecorator = <TFunction extends Function>(target: TFunction) => TFunction | void; рд╣реИред рд╢рд╛рдпрдж рдЗрд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

declare type MutatingClassDecorator = <TFunction extends Function>(target: TFunction) => TFunction | void;
declare type WrappingClassDecorator = <TFunction extends Function, TDecoratorFunction extends Function>(target: TFunction) => TDecoratorFunction;
declare type ClassDecorator = MutatingClassDecorator | WrappingClassDecorator;

рдЬрд╛рд╣рд┐рд░ рд╣реИ рдирд╛рдордХрд░рдг рдмреЗрдХрд╛рд░ рд╣реИ рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬ рдХрд╛рдо рдХрд░реЗрдЧреА (рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ рдмреИрдмреЗрд▓ рдРрдк рдХреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдорд╛рд░ рд░рд╣рд╛ рд╣реВрдВ)ред

@joyt рдХреНрдпрд╛ рдЖрдк рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░реЗрдбрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрдк рдЬреЛ рднреА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@masaeedu рдпрд╣рд╛рдБ рдЪрд▓рддреА рднрд╛рдЧреЛрдВ рдХрд╛ рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдЯреВрдЯрдирд╛ рд╣реИ ..

рдореВрд▓ рд░реВрдк рд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рд░рд┐рдПрдХреНрдЯ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЛ рдкреНрд░реЙрдкреНрд╕ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдбреЗрдХреЛрд░реЗрдЯреЗрдб рдХрдВрдкреЛрдиреЗрдВрдЯ рдХрд╛ рд╕рдмрд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ, рд╕реБрдкрд░рд╕реЗрдЯ рдирд╣реАрдВред

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╣рд╛рдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЦреЗрд▓рдиреЗ рдХреЗ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреИрд░-рдЪрд▓рд╛рдиреЗ рдпреЛрдЧреНрдп рдирдореВрдирд╛ рдПрдХ рд╕рд╛рде рд░рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред

// React types
class Component<TProps> {
    props: TProps
}
class ComponentClass<TProps> {
}
interface ComponentDecorator<TOriginalProps, TOwnProps> {
(component: ComponentClass<TOriginalProps>): ComponentClass<TOwnProps>;
}

// Redux types
interface MapStateToProps<TStateProps, TOwnProps> {
    (state: any, ownProps?: TOwnProps): TStateProps;
}

// Fake react create class
function createClass(component: any, props: any): any {
}

// Connect wraps the decorated component, providing a bunch of the properies
// So we want to return a ComponentDecorator which exposes LESS than
// the original component
function connect<TStateProps, TOwnProps>(
    mapStateToProps: MapStateToProps<TStateProps, TOwnProps>
): ComponentDecorator<TStateProps, TOwnProps> {
    return (ComponentClass) => {
        let mappedState = mapStateToProps({
            bar: 'bar value'
        })
        class Wrapped {
            render() {
                return createClass(ComponentClass, mappedState)
            }
        }

        return Wrapped
    }
}


// App Types
interface AllProps {
    foo: string
    bar: string
}

interface OwnProps {
    bar: string
}

// This does not work...
// @connect<AllProps, OwnProps>(state => state.foo)
// export default class MyComponent extends Component<AllProps> {
// }

// This does
class MyComponent extends Component<AllProps> {
}
export default connect<AllProps, OwnProps>(state => state.foo)(MyComponent)
//The type exported should be ComponentClass<OwnProps>,
// currently the decorator means we have to export ComponentClass<AllProps>

рдпрджрд┐ рдЖрдк рдПрдХ рдкреВрд░реНрдг рдХрд╛рдордХрд╛рдЬреА рдЙрджрд╛рд╣рд░рдг рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ https://github.com/jaysoo/todomvc-redux-react-typescript рдпрд╛ рдЕрдиреНрдп рдирдореВрдирд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛/рд░реЗрдбрдХреНрд╕/рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдиреАрдЪреЗ рдЦреАрдВрдЪ рд▓реЗрдВред

https://github.com/wycats/javascript-decorators#class -declaration рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд declare type WrappingClassDecorator = <TFunction extends Function, TDecoratorFunction extends Function>(target: TFunction) => TDecoratorFunction; рдЕрдорд╛рдиреНрдп рд╣реИред

рдпреБрдХреНрддрд┐ рдХрд╣рддреА рд╣реИ:

@F("color")
<strong i="6">@G</strong>
class Foo {
}

рдЗрд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╣реИ:

var Foo = (function () {
  class Foo {
  }

  Foo = F("color")(Foo = G(Foo) || Foo) || Foo;
  return Foo;
})();

рддреЛ рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рддреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

declare function F<T>(target: T): void;

<strong i="13">@F</strong>
class Foo {}

let a: Foo = new Foo(); // valid
class X {}
declare function F<T>(target: T): X;

<strong i="16">@F</strong>
class Foo {}

let a: X = new Foo(); // valid
let b: Foo = new Foo(); // INVALID
declare function F<T>(target: T): void;
declare function G<T>(target: T): void;

<strong i="19">@F</strong>
<strong i="20">@G</strong>
class Foo {}

let a: Foo = new Foo(); // valid
class X {}
declare function F<T>(target: T): void;
declare function G<T>(target: T): X;

<strong i="23">@F</strong>
<strong i="24">@G</strong>
class Foo {}

<strong i="25">@G</strong>
class Bar {}

<strong i="26">@F</strong>
class Baz {}

let a: Foo = new Foo(); // valid
let b: X = new Foo(); // INVALID
let c: X = new Bar(); // valid
let d: Bar = new Bar(); // INVALID
let e: Baz = new Baz(); // valid
class X {}
declare function F<T>(target: T): X;
declare function G<T>(target: T): void;

<strong i="29">@F</strong>
<strong i="30">@G</strong>
class Foo {}

<strong i="31">@G</strong>
class Bar {}

<strong i="32">@F</strong>
class Baz {}

let a: X = new Foo(); // valid
let b: Bar = new Bar(); // valid
let c: X = new Baz(); // valid
let d: Baz = new Baz(); // INVALID

@blai

рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

class X {}
declare function F<T>(target: T): X;

<strong i="9">@F</strong>
class Foo {}

let a: X = new Foo(); // valid
let b: Foo = new Foo(); // INVALID

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ F рдПрдХ рд╡рд░реНрдЧ рджреЗрддрд╛ рд╣реИ рдЬреЛ X рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ (рдФрд░ X рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИ)? рдЬреИрд╕реЗ:

declare function F<T>(target: T): typeof X;

рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рджрд╛рд╡рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

let a: X = new Foo(); // valid
let b: Foo = new Foo(); // valid

Foo рдЬреЛ рдЙрди let рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реИ, рдЙрд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдиреЗ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред рдореВрд▓ Foo рдЕрдм рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:

let Foo = F(class Foo {});

@nevir рд╣рд╛рдБ, рддреБрдо рд╕рд╣реА рд╣реЛред рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдПрдХ рддрд░рдл рдзреНрдпрд╛рди рджреЗрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╡рд░реНрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрд╕рд╛рди рд╣реИ:

diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts
index 06591a7..2320aff 100644
--- a/src/compiler/checker.ts
+++ b/src/compiler/checker.ts
@@ -11584,10 +11584,6 @@ namespace ts {
           */
         function getDiagnosticHeadMessageForDecoratorResolution(node: Decorator) {
             switch (node.parent.kind) {
-                case SyntaxKind.ClassDeclaration:
-                case SyntaxKind.ClassExpression:
-                    return Diagnostics.Unable_to_resolve_signature_of_class_decorator_when_called_as_an_expression;
-
                 case SyntaxKind.Parameter:
                     return Diagnostics.Unable_to_resolve_signature_of_parameter_decorator_when_called_as_an_expression;
         }

         /** Check a decorator */
        function checkDecorator(node: Decorator): void {
             const signature = getResolvedSignature(node);
             const returnType = getReturnTypeOfSignature(signature);
             if (returnType.flags & TypeFlags.Any) {
@@ -14295,9 +14291,7 @@ namespace ts {
             let errorInfo: DiagnosticMessageChain;
             switch (node.parent.kind) {
                 case SyntaxKind.ClassDeclaration:
-                    const classSymbol = getSymbolOfNode(node.parent);
-                    const classConstructorType = getTypeOfSymbol(classSymbol);
-                    expectedReturnType = getUnionType([classConstructorType, voidType]);
+                    expectedReturnType = returnType;
                     break;

                 case SyntaxKind.Parameter:
         }

рд▓реЗрдХрд┐рди рдореИрдВ рд╕рдВрдХрд▓рдХ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╡рд░реНрдЧ рдХреА рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░ рдирд╣реАрдВ рд╣реВрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдирд┐рдореНрди рдкрд░реАрдХреНрд╖рдг рд╣реИ:

рдкрд░реАрдХреНрд╖рдг/рдорд╛рдорд▓реЗ/рдЕрдиреБрд░реВрдкрддрд╛/рд╕рдЬреНрдЬрд╛рдХрд╛рд░/рд╡рд░реНрдЧ/рд╕рдЬреНрдЬрд╛рдХрд╛рд░OnClass10.ts

// <strong i="10">@target</strong>:es5
// <strong i="11">@experimentaldecorators</strong>: true
class X {}
class Y {}

declare function dec1<T>(target: T): T | typeof X;
declare function dec2<T>(target: T): typeof Y;

<strong i="12">@dec1</strong>
<strong i="13">@dec2</strong>
export default class C {
}

var c1: X | Y = new C();
var c2: X = new C();
var c3: Y = new C();

рдпрд╣ рдкрд░реАрдХреНрд╖рдг/рдЖрдзрд╛рд░рднреВрдд/рд╕реНрдерд╛рдиреАрдп/рд╕рдЬреНрдЬрд╛рдХрд╛рд░OnClass10.types рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ

=== tests/cases/conformance/decorators/class/decoratorOnClass10.ts ===
class X {}
>X : X

class Y {}
>Y : Y

declare function dec1<T>(target: T): T | typeof X;
>dec1 : <T>(target: T) => T | typeof X
>T : T
>target : T
>T : T
>T : T
>X : typeof X

declare function dec2<T>(target: T): typeof Y;
>dec2 : <T>(target: T) => typeof Y
>T : T
>target : T
>T : T
>Y : typeof Y

<strong i="17">@dec1</strong>
>dec1 : <T>(target: T) => T | typeof X

<strong i="18">@dec2</strong>
>dec2 : <T>(target: T) => typeof Y

export default class C {
>C : C
}

var c1: X | Y = new C();
>c1 : X | Y
>X : X
>Y : Y
>new C() : C
>C : typeof C

var c2: X = new C();
>c2 : X
>X : X
>new C() : C
>C : typeof C

var c3: Y = new C();
>c3 : Y
>Y : Y
>new C() : C
>C : typeof C

рдореИрдВ рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛
>C: typeof C рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП >C: typeof X | typeof Y

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЗрд╕ рд╕реНрдЯрдбреА рдХреЗ рд░реВрдк рдореЗрдВ рд░рд┐рдПрдХреНрдЯ-рд░реЗрдбрдХреНрд╕ рдХреЗ connect рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП https://github.com/DefinitelyTyped/DefinitelyTyped/issues/9951 рджрд╛рдпрд░ рдХрд┐рдпрд╛ рд╣реИред

рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдкрдврд╝ рд▓рд┐рдпрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ рд╣реИ рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд▓рд┐рдкрдЯреЗ рд╣реБрдП рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

function decorator(target) {
    target.prototype.someNewMethod = function() { ... };
    return new Wrapper(target);
}

рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
declare function decorator<T>(target: T): Wrapper<T>;

рд▓реЗрдХрд┐рди рдпрд╣ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рдиреЗ рд▓рдХреНрд╖реНрдп рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рдирдИ рдЪреАрдЬреЗрдВ рдЬреЛрдбрд╝ рджреА рд╣реИрдВред

рджреВрд╕рд░реА рдУрд░, рдпрд╣ рд╣рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЖрд╡рд░рдг рд▓реМрдЯрд╛рдпрд╛ рд╣реИ:
declare function decorator<T>(target: T): T & { someMethod: () => void };

рдЗрд╕ рдкрд░ рдХреЛрдИ рднреА рд╕рдорд╛рдЪрд╛рд░? рдпрд╣ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реБрдкрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реЛрдЧрд╛!

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдПрдХ рд╕рдЬрд╛рдП рдЧрдП рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡рд░реНрдЧ рдХреЗ рдирд╛рдо рдХреЛ рд╕рдЬрд╛рд╡рдЯреА рдЪреАрдиреА рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдЬрд╛рд╡рдЯреА рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рд╕реЗ рдмрд╛рдВрдзрддреЗ рд╣реИрдВред

declare function Blah<T>(target: T): T & {foo: number}

<strong i="6">@Blah</strong>
class Foo {
    bar() {
        return this.foo; // Property 'foo' does not exist on type 'Foo'
    }
}

// is desugared to
const Foo = Blah(class Foo {
  // this.foo is not available here
})

new Foo.foo // foo is available here.

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рд╡рд╛рд░, рдпрд╣ рд╕рдЬрд╛рдП рдЧрдП рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдкреНрд░рддреАрдХ рдкреЗрд╢ рдХрд░реЗрдЧрд╛ред рдФрд░ рдореВрд▓ рд╡рд░реНрдЧ рдХрд╛ рдирд╛рдо рдХреЗрд╡рд▓ рдХреНрд▓рд╛рд╕ рдмреЙрдбреА рд╕реНрдХреЛрдк рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реИред

@HerringtonDarkholme рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реЛрдЧрд╛ рдЬреЛ рд╡рд╛рдВрдЫрд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред рдорд╣рд╛рди рд╡рд┐рдЪрд╛рд░!

рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдХрд┐рд╕реА рджрд┐рди рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ

рдореИрдВ рдЕрдХреНрд╕рд░ рдХреЛрдгреАрдп 2 рдпрд╛ рдСрд░реЗрд▓рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

import {Http} from 'aurelia-fetch-client';
import {User} from 'models';

// accesses backend routes for 'api/user'
<strong i="9">@autoinject</strong> export default class UserService {
  constructor(readonly http : Http) { }

  readonly resourceUrl = 'api/users';

  async get(id: number) {
    const response = await this.http.fetch(this.resourceUrl);
    const user = await response.json() as User;
    return user;
  }

  async post(id: number, model: { [K in keyof User]?: User[K] }) {
    const response = await this.http.post(`${this.resourceUrl}/`${id}`, model);
    return await response.json();
  }
}

рдореИрдВ рдЬреЛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ
рд╕рдЬреНрдЬрд╛рдХрд╛рд░/api-client.ts

import {Http} from 'aurelia-fetch-client';

export type Target = { name; new (...args): { http: Http }};

export default function apiClient<T extends { id: string }>(resourceUrl: string) {
  return (target: Target)  => {
    type AugmentedTarget = Target & { get(id: number): Promise<T>, post(id, model: Partial<T>) };
    const t = target as AugmentedTarget;
    t.prototype.get = async function (id: number) {
      const response = await this.http.fetch(resourceUrl);
      return await response.json() as T;
    }
  }
}

рдФрд░ рдлрд┐рд░ рдореИрдВ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рдерд╛

import {Http} from 'aurelia-fetch-client';
import apiClient from ./decorators/api-client
import {User} from 'models';

@apiClient<User>('api/users') export default class UserService {
  constructor(readonly http : Http) { }
}

рдЯрд╛рдЗрдкрд╕реЗрдлреНрдЯреА рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд┐рдирд╛ред рд╕реНрд╡рдЪреНрдЫ, рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рд╡рд░рджрд╛рди рд╣реЛрдЧрд╛ред

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХрд░рдирд╛ред

рдЕрдм рдЬрдм #13743 рдмрд╛рд╣рд░ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рднрд╛рд╖рд╛ рдореЗрдВ рдорд┐рд╢реНрд░рд┐рдд рд╕рдорд░реНрдерди рд╣реИ рддреЛ рдпрд╣ рдПрдХ рд╕реБрдкрд░ рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред

@HerringtonDarkholme рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдХрдо рдЙрдкрдпреБрдХреНрдд рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рд╕реЗ рдХреБрдЫ рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЦреЛ рдЬрд╛рддреА рд╣реИрдВ ...

@ahejlsberg , @mhegazy рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ?

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧ рдкрд░рд┐рджреГрд╢реНрдп рд╣реИ рдЬреЛ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрднреА рддрдХ рдЗрд╕ рд╡рд╛рд░реНрддрд╛рд▓рд╛рдк рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЙрд╕реА рдЫрддрд░реА рдХреЗ рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИред

рдореИрдВ рдПрдХ рд╡рд┐рдзрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рдзрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ (рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рд╕рдВрдкреВрд░реНрдг рдлрд╝рдВрдХреНрд╢рди)ред рдЬреИрд╕реЗ

type AsyncTask<Method extends Function> = {
    isRunning(): boolean;
} & Method;

// Decorator definition...
function asyncTask(target, methodName, descriptor) {
    ...
}

class Order {
    <strong i="7">@asyncTask</strong>
    async save(): Promise<void> {
        // Performs an async task and returns a promise
        ...
    }
}

const order = new Order();

order.save();
order.save.isRunning(); // Returns true

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╡ рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдореБрдЭреЗ asyncTask рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕рдЬрд╛рдП рдЧрдП рддрд░реАрдХреЗ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ () => Promise<void> рд╕реЗ AsyncTask<() => Promise<void>> рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХреЗред

рдмрд╣реБрдд рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╢рд╛рдпрдж рдЗрд╕ рдореБрджреНрджреЗ рдХреА рдЫрддреНрд░рдЫрд╛рдпрд╛ рдореЗрдВ рдЖрддрд╛ рд╣реИ?

@codeandcats рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдареАрдХ рдЙрд╕реА рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореИрдВ рдпрд╣рд╛рдБ рд╣реВрдБ!

рд╣рд╛рдп @ohjames , рдореБрдЭреЗ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореБрдЭреЗ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рд░рд╣реА рд╣реИ, рдХрд┐рд╕реА рднреА рдореМрдХреЗ рдкрд░ рдЖрдк рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИ?

рдЗрд╕ рдкрд░ рдХреЛрдИ рдкреНрд░рдЧрддрд┐? рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдпрд╣ рдкреВрд░реЗ рджрд┐рди рдерд╛, рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рдЕрдирдЬрд╛рди, рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдпрд╛ рдХрд┐ рд╕рдВрдХрд▓рдХ рдЗрд╕реЗ рдирд╣реАрдВ рдЙрдард╛рддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ рдЬреЛ рдПрдХ рдмреЗрд╣рддрд░ рд▓реЙрдЧрд┐рдВрдЧ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдмрд╛рдж рдореЗрдВ рдПрдХ рдкреВрд░реНрдг рд▓реЙрдЧрд░ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд╡рд░рд┐рдд рд╕рд┐рдВрдЧрд▓рдЯрди рд▓рд┐рдЦрд╛ рдерд╛ рдЬрд┐рд╕реЗ рдореИрдВ рдПрдХ рд╕рдЬрд╛рд╡рдЯреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рдерд╛

<strong i="6">@loggable</strong>
class Foo { }

рдФрд░ рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб рд▓рд┐рдЦрд╛

type Loggable<T> = T & { logger: Logger };

function loggable<T extends Function>(target: T): Loggable<T>
{
    Object.defineProperty(target.prototype, 'logger',
        { value: Logger.instance() });
    return <Loggable<T>> target;
}

рдФрд░ logger рд╕рдВрдкрддреНрддрд┐ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдореМрдЬреВрдж рд╣реИ рд▓реЗрдХрд┐рди рдЕрдлрд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдЙрдард╛рдпрд╛ рдЧрдпрд╛ред

рдореБрдЭреЗ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреБрдЫ рд╕рдВрдХрд▓реНрдк рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рд░рдирдЯрд╛рдЗрдо рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдареАрдХ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВрдиреЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдмрд╕рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛:

function logger<T>(target: T, key: string): void
{
    Object.defineProperty(target, 'logger',
        { value: Logger.instance() });
}

рдФрд░ рдЗрд╕реЗ рдЬреИрд╕реА рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛

class Foo {
    <strong i="19">@logger</strong> private logger: Logger;
    ...

рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг @loggable рд╡рд░реНрдЧ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддрд┐ рд╡рд░реНрдЧ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ (this as Loggable<this>).logger рдХреА рддрд░рд╣ рдЯрд╛рдЗрдкрдХрд╛рд╕реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдпрд╣ рдЖрджрд░реНрд╢ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЗрд╕реЗ рдХреБрдЫ рд╣рдж рддрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рджред рдпрд╣ рдмрд╣реБрдд рдЬрд▓реНрджреА рдердХрд╛рдК рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЭреЗ рдкреВрд░реЗ рдРрдк рдХреЗ рд▓рд┐рдП рдЯреАрдПрд╕ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдореИрдВ https://github.com/jeffijoe/mobx-task рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рдерд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░ рдЬрд▓реНрдж рд╣реА рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ

рдпрд╣ рдПрдВрдЧреБрд▓рд░ 2 рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдмрд╣реБрдд рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рдирд╛рдЧрд░рд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рднреА рдЬрд┐рд╕ рдорд┐рдирдЯ рдЖрдк рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдПрдВрдЧреБрд▓рд░ 2 рдЯреАрдо рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдкреА рджрд┐рдЦрд╛рдПрдЧреАред

@zajrik рдЖрдк рдЯреАрдПрд╕ 2.2 рдХреЗ рдмрд╛рдж рд╕реЗ рдЙрдЪрд┐рдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдорд░реНрдерд┐рдд рдХреНрд▓рд╛рд╕ рдорд┐рдХреНрд╕рд┐рди рдХреЗ рд╕рд╛рде рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдЕрдкрдиреЗ рд▓реЙрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдорд┐рд╢реНрд░рдг рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:

type Constructor<T> = new(...args: any[]) => T;

interface Logger {}

// You don't strictly need this interface, type inference will determine the shape of Loggable,
// you only need it if you want to refer to Loggable in a type position.
interface Loggable {
  logger: Logger;
}

function Loggable<T extends Constructor<object>>(superclass: T) {
  return class extends superclass {
    logger: Logger;
  };
}

рдФрд░ рдлрд┐рд░ рдЖрдк рдЗрд╕реЗ рдХреБрдЫ рддрд░реАрдХреЛрдВ рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛ рддреЛ рд╡рд░реНрдЧ рдШреЛрд╖рдгрд╛ рдХреЗ extends рдЦрдВрдб рдореЗрдВ:

class Foo {
  superProperty: string;
}

class LoggableFoo extends Loggable(Foo) {
  subProperty: number;
}

TS рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ LoggableFoo superProperty , logger , рдФрд░ subProperty рд╣реИрдВ:

const o = new LoggableFoo();
o.superProperty; // string
o.logger; // Logger
o.subProperty; // number

рдЖрдк рдПрдХ рдорд┐рдХреНрд╕рд┐рди рдХреЛ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЙрд╕ рдареЛрд╕ рд╡рд░реНрдЧ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

const LoggableFoo = Loggable(Foo);

рдЖрдк _can_ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдХреНрд▓рд╛рд╕ рдорд┐рдХреНрд╕рд┐рди рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЕрд▓рдЧ рд╢рдмреНрджрд╛рд░реНрде рд╣реИрдВ, рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЖрдкрдХреА рдХрдХреНрд╖рд╛ рдХреЛ рдЙрдк-рд╡рд░реНрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдкрдХреА рдХрдХреНрд╖рд╛ рдХреЛ рдЙрдк-рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рддрд╛ рд╣реИред

рд╕рдЬреНрдЬрд╛рдХрд╛рд░, IMO рдкрд░ рдХреНрд▓рд╛рд╕ рдорд┐рдХреНрд╕рд┐рди рдХреЗ рдХрдИ рдлрд╛рдпрджреЗ рд╣реИрдВ:

  1. рд╡реЗ рдПрдХ рдирдпрд╛ рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдмрдирд╛рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдЬрд┐рд╕ рд╡рд░реНрдЧ рдореЗрдВ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЙрд╕рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрджрд▓рд╛рд╡ рд╣реЛ
  2. рд╡реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдХрд┐рд╕реА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛, рдЕрднреА рдЪреЗрдХ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ
  3. рд╡реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ - рдЖрдкрдХреЛ рдорд┐рдХреНрд╕рд┐рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд░рд┐рдЯрд░реНрди рдорд╛рди рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
  4. рд╡реЗ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрдореНрдк-рдЯреВ-рдбреЗрдлрд┐рдирд┐рд╢рди - logger рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдХреВрджрдирд╛ рдЖрдкрдХреЛ рдорд┐рд╢реНрд░рд┐рдд _рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди_ рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдирд╣реАрдВред

@justinfagnani рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдорд┐рд╢реНрд░рдг рднреА рдирд╣реАрдВ рдорд╛рдирд╛ рдерд╛ рдЗрд╕рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЖрдЧреЗ рдмрдврд╝реВрдВрдЧрд╛ рдФрд░ рдЕрдкрдиреЗ рд▓реЙрдЧрд░ рдЕрдЯреИрдЪрдореЗрдВрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдЪреНрдЫрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЬ рд░рд╛рдд рдПрдХ Loggable рдорд┐рдХреНрд╕рд┐рди рд▓рд┐рдЦреВрдВрдЧрд╛ред extends Mixin(SuperClass) рдорд╛рд░реНрдЧ рдореЗрд░рд╛ рдкрд╕рдВрджреАрджрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ TS 2.2 рдХреА рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рдмрд╛рдж рд╕реЗ рдЕрдм рддрдХ рдорд┐рдХреНрд╕рд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред

рдореИрдВ рдорд┐рд╢реНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдЬрд╛рд╡рдЯреА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдЕрднреА рднреА рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ-рдореБрдХреНрдд рдорд┐рдХреНрд╕рд┐рди рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдХреНрд▓реАрдирд░ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╡рд░рджрд╛рди рд╣реЛрдЧрд╛ред

@zajrik рдЦреБрд╢реА рд╣реИ рдХрд┐ рд╕реБрдЭрд╛рд╡ рдиреЗ рдорджрдж рдХреА, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐

рдореБрдЭреЗ рдЕрднреА рднреА рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдорд┐рд╢реНрд░рдг рдореЗрдВ рд╕рдЬрд╛рд╡рдЯреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╣реЛрддрд╛ рд╣реИред рд╡реЗ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рднрд╛рд░ рдореЗрдВ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИрдВ:

рдХреНрд▓рд╛рд╕ рдорд┐рдХреНрд╕рд┐рди:

class LoggableFoo extends Loggable(Foo) {}

рдмрдирд╛рдо рдбреЗрдХреЛрд░реЗрдЯрд░:

<strong i="12">@Loggable</strong>
class LoggableFoo extends Foo {}

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдорд┐рд╢реНрд░рдг рдЕрдкрдиреЗ рдЗрд░рд╛рджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реИ: рдпрд╣ рдПрдХ рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдЙрддреНрдкрдиреНрди рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдорд┐рд╢реНрд░рдг рд╢рд╛рдпрдж рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред

рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрддрдиреА рд╕рд╛рд░реА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдЖрдк рдпрд╣ рдирд╣реАрдВ рдорд╛рди рд╕рдХрддреЗ рдХрд┐ рдпрд╣ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрд╣ рдмрд╕ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛, рдпрд╛ рдЙрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдирд┐рд╖реНрдкрдХреНрд╖ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @zajrik рдХреНрдпрд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ:

<strong i="7">@loggable</strong>
class Foo { }

рдЬреЛ рдирд┐рд░реНрд╡рд┐рд╡рд╛рдж рд░реВрдк рд╕реЗ, рдпрджрд┐ рдХрднреА рдЗрддрдирд╛ рдереЛрдбрд╝рд╛, рдХрдо рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╣реИред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореБрдЭреЗ рдорд┐рдХреНрд╕рд┐рди рд╕реЙрд▓реНрдпреВрд╢рди рдмрд╣реБрдд рдкрд╕рдВрдж рд╣реИред рдореИрдВ рднреВрд▓рддрд╛ рд░рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдорд┐рд╢реНрд░рдг рдПрдХ рдЪреАрдЬ рд╣реИред

рдпрджрд┐ рдЖрдк рд╕рднреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╡рд░реНрддрдорд╛рди рд╡рд░реНрдЧ рдореЗрдВ рдЧреБрдг рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдорд┐рд╢реНрд░рдг рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░реЗрд╢рд╛рдиреА рдХреЗ рд╕рд╛рде рд╕рдЬрд╛рд╡рдЯреА рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддреЗ рд╣реИрдВ ... рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рднрд╛рд░реА рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдорд┐рд╢реНрд░рдг рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ ( extends Mixin(Class, { ... }) рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ)ред

@justinfagnani рдЖрдкрдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ, рдЕрдВрдХ 2-4 рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ рди рдХрд┐ рдорд┐рдХреНрд╕рд┐рди рдХреЗ рдлрд╛рдпрджреЗред рд╡реЗ рдЬреЗрдПрд╕ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рднреА рдХреЛ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдУрдкреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдорд┐рд╢реНрд░рдг рдЖрдзрд╛рд░рд┐рдд рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рджреЛ рд╡рд░реНрдЧ рдЬреЛрдбрд╝рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдмреЗрдХрд╛рд░ рд╣реИред рдпрд╣ рдорд┐рдХреНрд╕рд┐рдВрд╕ рдмрдирд╛рдо рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдЕрдВрддрд░ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдорд┐рдХреНрд╕рд┐рдВрд╕ рдЖрдкрдХреЛ рдкреИрд░реЗрдВрдЯ рдХреНрд▓рд╛рд╕ рдЪреЗрди рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рджреЗрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, 95% рд╕рдордп рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд▓реЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡реЗ рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рд╕рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЬрдмрдХрд┐ рдорд┐рдХреНрд╕рд┐рди рдХреЗ рдЕрдкрдиреЗ рд╕реАрдорд┐рдд рдЙрдкрдпреЛрдЧ рд╣реЛрддреЗ рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдФрд░ рдЙрдЪреНрдЪ рдХреНрд░рдо рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╢рдмреНрджрд╛рд░реНрде рд░реВрдк рд╕реЗ рдЕрдиреБрдЪрд┐рдд рд╣реИред

рдорд┐рдХреНрд╕рд┐рдВрд╕ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЭреБрдВрдЭрд▓рд╛рд╣рдЯ рдХреЗ рд╕рд╛рде рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддреЗ рд╣реИрдВ ... рдпрджрд┐ рдЖрдкрдХреА рдХрдХреНрд╖рд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдХреЛрдИ рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд╛рд▓реА рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рдпрд╣ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рд╕рдЪ рд╣реЛ:

function Mixin(superclass = Object) { ... }

class Foo extends Mixin() {}

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рднрд╛рд░реА рд▓рдЧрддрд╛ рд╣реИред

рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдРрд╕рд╛ рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЕрд╕рд╣рдордд рд╣реЛрдирд╛ рдкрдбрд╝реЗрдЧрд╛ред

рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдорд┐рд╢реНрд░рдг рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ (рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдорд┐рдХреНрд╕рд┐рди (рдХрдХреНрд╖рд╛, {...}) рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ)ред

рд╡реЗ рдмрд╣реБрдд рд╣реИрдВред рдорд┐рдХреНрд╕рд┐рди рд╕рд┐рд░реНрдл рдХрд╛рд░реНрдп рд╣реИрдВред

рдЖрдкрдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ, рдЕрдВрдХ 2-4 рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ рди рдХрд┐ рдорд┐рдХреНрд╕рд┐рди рдХреЗ рдлрд╛рдпрджреЗред рд╡реЗ рдЬреЗрдПрд╕ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

рдпрд╣ рдПрдХ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдпрд╣рд╛рдВ рдЖрд╡реЗрджрди рдХрд░рддреЗ рд╣реИрдВред рдЬреЗрдПрд╕ рдореЗрдВ рд╡рд┐рд╢реНрд╡ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрднреА рддрдХ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рднреА рдХреЛ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдУрдкреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдорд┐рд╢реНрд░рдг рдЖрдзрд╛рд░рд┐рдд рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рджреЛ рд╡рд░реНрдЧ рдЬреЛрдбрд╝рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдмреЗрдХрд╛рд░ рд╣реИред

рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдЖрдкрдХреЛ рджреЛ рдХрд╣рд╛рдВ рдорд┐рд▓рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╣реИ, рдЬреИрд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдкреИрдЪрд┐рдВрдЧ рди рд╣реЛред рдФрд░ рдХреМрди рд╕рд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдмреЗрдХрд╛рд░ рд╣реИ? рдорд┐рд╢реНрд░рдг рдЖрд╡реЗрджрди рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╕рдВрдкрддреНрддрд┐/рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдпрд╣ рдмреЗрдХрд╛рд░ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рдорд┐рдХреНрд╕рд┐рдВрд╕ рдмрдирд╛рдо рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдЕрдВрддрд░ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдорд┐рдХреНрд╕рд┐рдВрд╕ рдЖрдкрдХреЛ рдкреИрд░реЗрдВрдЯ рдХреНрд▓рд╛рд╕ рдЪреЗрди рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рджреЗрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, 95% рд╕рдордп рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд▓реЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡реЗ рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рд╕рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдЪ рд╣реИред рдЖрдо рддреМрд░ рдкрд░ рдЬрдм рдЖрдк рдХрд┐рд╕реА рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рд╡рд┐рд░рд╛рд╕рдд рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдирд┐рдЪрд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╣реЛрдЧрд╛ред рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЛ рдпрд╛ рддреЛ рд╡рд░реНрдЧ рдХреЛ рдкреИрдЪ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ super() рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдпрд╛ рдЗрд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдЬрд╛рдП рдЧрдП рд╡рд░реНрдЧ рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЬреЛ рдкреНрд░рджрд░реНрд╢рди/рдбрд┐рдмрдЧрд┐рдВрдЧ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд░рд╛рд╕рдд рдореЙрдбрд▓ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИред

рдЬрдмрдХрд┐ рдорд┐рдХреНрд╕рд┐рди рдХреЗ рдЕрдкрдиреЗ рд╕реАрдорд┐рдд рдЙрдкрдпреЛрдЧ рд╣реЛрддреЗ рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдФрд░ рдЙрдЪреНрдЪ рдХреНрд░рдо рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╢рдмреНрджрд╛рд░реНрде рд░реВрдк рд╕реЗ рдЕрдиреБрдЪрд┐рдд рд╣реИред

рдЬрдм рдХреЛрдИ рдбреЗрд╡рд▓рдкрд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдорд┐рд╢реНрд░рдг рдмрд┐рд▓реНрдХреБрд▓ рд╢рдмреНрджрд╛рд░реНрде рд░реВрдк рд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реЛрддреЗ рд╣реИрдВред рд╣рд░ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдорд┐рдХреНрд╕рд┐рди рдХреЗ рд▓рд┐рдП рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдХреНрд▓рд╛рд╕ рдорд┐рдХреНрд╕рд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╣реА рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рде рдХрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕реЗ рдЙрдореНрдореАрдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╕реБрдкрд░ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдХрд╛рд░рдг рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛рдкрди, рдФрд░ рдХреЗ рдмреЗрд╢рдХ рд╡реЗ рдЕрдм рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рдЬрдм рд╡реЗ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдорд┐рдХреНрд╕рд┐рди рд╢рд╛рдпрдж рд╣реА рдЕрдиреБрдкрдпреБрдХреНрдд рд╣реЛрддреЗ рд╣реИрдВред

рдЬрдм рдХреЛрдИ рдбреЗрд╡рд▓рдкрд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ

рдареАрдХ рдпрд╣реА рдореЗрд░реА рдмрд╛рдд рд╣реИ, рдУрдкреА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рд╡рд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдФрд░ рдЕрдзрд┐рдХрддрд░ рдЬрдм рд▓реЛрдЧ рд╕рдЬрд╛рд╡рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЙрдирдХреЗ рдкрд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдореВрд▓ рд╡рд░реНрдЧ рднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ Mixin(Object) рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдбрдореА рдЦрд╛рд▓реА рд╡рд░реНрдЧ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рддреЛ рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ 2 рдХреА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИ (рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд╣рд┐рдд рдирд╣реАрдВ) рдЬрдм рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдирдИ рдХрдХреНрд╖рд╛рдПрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рд▓рд╛рдЧрдд рд╣реИред

рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП Mixin1(Mixin2(Mixin3(Object, { ... }), {... }), {...}) рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред рдкреНрд░рддреНрдпреЗрдХ рдорд┐рдХреНрд╕рд┐рди рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдорд┐рдХреНрд╕рд┐рди-рдХреНрд▓рд╛рд╕ рд╕реЗ рдЙрддрдиреЗ рд╣реА рджреВрд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рддрдиреЗ рд╡реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИред

рдЬрдмрдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рддрд┐-рд╕реЗ рдЪреЗрдХ рдЯрд╛рдЗрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЖрдк рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдХреЗрд╡рд▓ рдирд┐рдпрдорд┐рдд рдлрд╝рдВрдХреНрд╢рди рдЖрдордВрддреНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

class Logger { static instance() { return new Logger(); } }
type Loggable<T> = T & { logger: Logger };
function loggable<T, U>(target: { new (): T } & U): { new (): Loggable<T> } & U
{
    // ...
}

const Foo = loggable(class {
    x: string
});

let foo = new Foo();
foo.logger; // Logger
foo.x; // string

рдпрд╣ рдереЛрдбрд╝рд╛ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЛ const Foo = loggable(class { рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣ рд╕рдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

@ohjames (cc @justinfagnani) рдЖрдкрдХреЛ Object рдЬреИрд╕реЗ рдмрд┐рд▓рд┐рдиреНрд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╕рдордп рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рд╣реЛрдЧрд╛ (рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЖрдкрдХреЗ рдЙрдкрд╡рд░реНрдЧ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкрд░ рд╣рдорд▓рд╛ рдХрд░рддреЗ рд╣реИрдВ): https://github.com/Microsoft/TypeScript/wiki/FAQ #рдХреНрдпреЛрдВ

@nevir рд╣рд╛рдБ, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 2.2 рдХреЗ рд╕рд╛рде рдбрд┐рдлрд╝реЙрд▓реНрдЯ Object рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдорд┐рдХреНрд╕рд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ @justinfagnani рдХреЗ рд╕реБрдЭрд╛рд╡ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ tsc рдХреЛрдб рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрддрд╛ рд╣реИред

@ohjames рдпрд╣ рдЕрднреА рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рд╣реЛрдЧрд╛ (рджреЗрдЦреЗрдВ рдХрд┐ рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐)ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, null рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдкрд░ tslib.__extend рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рдЖрдо рддреМрд░ рдкрд░ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЕрдЧрд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЪрд░рдг рдореЗрдВ рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ? рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд╛рдн рдЕрддреНрдпрдзрд┐рдХ рдЙрдЪреНрдЪ рд╣реИрдВред

рдореИрдВ рдмрд╕ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ - рдпрд╣ рдореБрдЭреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдХрд┐рд╕реА рднреА рдбреЗрдХреЛрд░реЗрдЯрд░-рдЖрдзрд╛рд░рд┐рдд рдврд╛рдВрдЪреЗ/рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реА рдорджрдж рд╣реЛрдЧреАред

@TomMarius рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдбреЗрдХреЛрд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рд▓рд┐рдкрдЯреЗ рд╡рд░реНрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдареАрдХ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ, рдЖрдк рдХреЗрд╡рд▓ @ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪреАрдиреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп:

<strong i="8">@loggable</strong>
class Foo { }

рдЖрдкрдХреЛ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ:

const Foo = loggable(class { });

рдЖрдк рдЙрдирдореЗрдВ рдХрдХреНрд╖рд╛ рд▓рдкреЗрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдЬрд╛рд╡рдЯреА рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪреАрдиреА рдХреЛ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рдореВрд▓реНрдпрд╡рд╛рди рд╣реИ, рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЗрддрдирд╛ рдмрдбрд╝рд╛ рджрд░реНрдж рдмрд┐рдВрджреБ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ рдЪреАрдЬреЗрдВ рд╣реИрдВред

@masaeedu рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрджреНрджрд╛ рдмрд╛рд╣рд░реА рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рд╣реИред рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд╕рдЬрд╛рд╡рдЯреА рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХрдХреНрд╖рд╛ рдореЗрдВ рд╣реА рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рд╣реИред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗрд╡рд▓ Foo рд▓реЙрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рд╡рд╣рди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

@zajrik рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдореВрд▓ рд╡рд░реНрдЧ рд╕реЗ рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддрдм рднреА рдЬрдм рдЖрдк рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд @ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЬрд╛рд╣рд┐рд░ рд╣реИ рдЬреЗрдПрд╕ рд╢реБрджреНрдзрддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЕрдкрдиреЗ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдореВрд▓ рд╡рд░реНрдЧ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдЬрд╛рд╡рдЯреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реИред рдпрджрд┐ рдЖрдк рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдХрд╕рдХрд░ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк рд╕рдЬрд╛рд╡рдЯреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдХреНрд╖рд╛ рдЖрдВрддрд░рд┐рдХ рдореЗрдВ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдЖрдВрддрд░рд┐рдХ рдЧреБрдг рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ?

рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдЙрджрд╛рд╣рд░рдг рд╕рдЬрд╛рдП рдЧрдП рд╡рд░реНрдЧ рдХреЗ рдЖрдВрддрд░рд┐рдХ рднрд╛рдЧ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп _want_ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИред (рдФрд░ рд╡рд░реНрдЧ рд╕рдЬрд╛рд╡рдЯ рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ; рдЬреИрд╕реЗ рдХрд┐ рдкрд╛рдпрдерди )

рдЙрд╕ рдиреЗ рдХрд╣рд╛, @justinfagnani рдХрд╛ рд╡рд░реНрдЧ рдорд┐рд╢реНрд░рдг рд╕реБрдЭрд╛рд╡ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд▓рдЧрддрд╛ рд╣реИ

рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рд╡рд░реНрдЧ рдХреЗ рдЖрдВрддрд░рд┐рдХ рднрд╛рдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдВрд░рдЪрд┐рдд рддрд░реАрдХрд╛ рд╡рд░реНрдЧ рдХреЛ рдкреИрдЪ рдХрд░рдирд╛ рдпрд╛ рдПрдХ рдирдП рдЙрдкрд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдирд╣реАрдВ рд╣реИ, рджреЛрдиреЛрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рддрд░реНрдХ рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛрдЧрд╛ рд╕реНрд╡рдпрдВ, рд▓реЗрдХрд┐рди рдпрд╛ рддреЛ рдХреЗрд╡рд▓ рдХрдХреНрд╖рд╛ рдореЗрдВ рд╣реА рдЪреАрдЬреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдПрдХ рдирдпрд╛ рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдЧреБрдг рд╣реЛрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рддрд░реНрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рд╡рд░реНрдЧ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рдирд╣реАрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрдХреНрд╖рд╛ рдпрд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗред @masaeedu рдпрд╣реАрдВ рдкрд░ рд╣реИред

рдЬрдмрдХрд┐ рдЖрдк рдЬреЛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╕рдЪ рд╣реИ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрд╡рдЪреНрдЫ рдХреЛрдбрд┐рдВрдЧ рдкреНрд░рдерд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдФрд░ рдпрд╣ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред

@masaeedu @zajrik рдиреЗ рдХреНрдпрд╛ рдХрд╣рд╛ред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдЬрд╛рд╡рдЯреА рд╣реИ рдЬреЛ "рдСрдирд▓рд╛рдЗрди рд╕реЗрд╡рд╛" рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрдХреНрд╖рд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛ рдореЗрдВ рдЧреБрдгреЛрдВ рдХрд╛ рд╕рдореВрд╣ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдФрд░ рдмрд╛рдзрд╛ рдкреНрд░рд╡рд░реНрддрди (рдпрджрд┐ рдЖрдк рдмрд┐рдирд╛ рдХреЛрдб рджреЛрд╣рд░рд╛рд╡ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ) рдХреЗ рдХрд╛рд░рдг рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЙрдк-рд╡рд░реНрдЧреАрдХрд░рдг рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдирд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред

@TomMarius рдореЗрд░рд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЬрд╛рдБрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЬрдм рдЖрдк рдХрд┐рд╕реА рдХреНрд▓рд╛рд╕ рдореЗрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрд▓рд╛рд╕ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдмрджрд▓реА рдЬрд╛рддреА рд╣реИред рдореВрд▓ рд╡рд░реНрдЧ рдХреЗ рдХреБрдЫ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдЗрд╕ рдирдП рд╡рд░реНрдЧ рдХреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рдПрдкреАрдЖрдИ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ "рдЧрд╛рдпрдм рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдФрд░ рдмрд╛рдзрд╛ рдкреНрд░рд╡рд░реНрддрди" рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ (рд╢рд╛рдпрдж рдПрдХ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рдорджрдж рдХрд░реЗрдЧрд╛), рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдкрдХреА рдХрдХреНрд╖рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рдПрдкреАрдЖрдИ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕реАрдзреЗ рдорд┐рдХреНрд╕рд┐рди рдкреИрдЯрд░реНрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд╡рд░реНрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП @justinfagnani рдиреЗ рджрд┐рдЦрд╛рдпрд╛ , рдпрд╛ рдЗрд╕реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдпрд╛ рдХреБрдЫ рдФрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВред рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдЙрди рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЗ рд▓рд╛рдн рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрди рдХреЗ рд▓рд┐рдП рдмрдВрдж рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╕реНрд╡рдпрдВ рдХрдХреНрд╖рд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ, рддреЛ рдмрд╕ extends рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

@masaeedu рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдорд╛рди рд▓реАрдЬрд┐рдП, рдПрдХ рдЖрд░рдкреАрд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рдФрд░ рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреЗрд╡рд▓ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡рд┐рд░рд╛рд╕рдд-рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЛ рдХреЛрдб рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ (рдпрд╛ рдореБрдЭреЗ рд╕рд╣реА рддрд░реАрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ , рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдЕрдЧрд░ рдЖрдкрдиреЗ рдореБрдЭреЗ рдмрддрд╛рдпрд╛ рдХрд┐ рдЕрдЧрд░ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ)ред

рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг
рдкрд░рд┐рднрд╛рд╖рд╛: export abstract class Service<T extends { [P in keyof T]: () => Promise<IResult>}> { protected someMethod(): Promise<void> { return Promise.reject(""); } }
рдЙрдкрдпреЛрдЧ: export default class MyService extends Service<MyService> { async foo() { return this.someMethod(); } }

рдбреЗрдХреЛрд░реЗрдЯрд░-рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг
рдкрд░рд┐рднрд╛рд╖рд╛: export function service<T>(target: { new (): T & { [P in keyof T]: () => Promise<IResult> } }) { target.someMethod = function () { return Promise.reject(""); }; return target; }
рдЙрдкрдпреЛрдЧ: <strong i="17">@service</strong> export default class { async foo() { return this.someMethod(); } }

рдЖрдк рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕-рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЛрдб рджреЛрд╣рд░рд╛рд╡ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдореЗрд░реЗ рдФрд░ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрдИ рдмрд╛рд░ рд╣реБрдЖ рд╣реИ рдХрд┐ рдЬрдм рд╡реЗ рдХрдХреНрд╖рд╛ рдХреЛ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ "рдХрд┐рд╕реА рднреА" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╡реЗ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдмрджрд▓рдирд╛ рднреВрд▓ рдЧрдП рд╣реИрдВ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдиреЗ рдЙрдирдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИ; рдбреЗрдХреЛрд░реЗрдЯрд░-рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрд╣реБрдд рдЕрдзрд┐рдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реИред

рдЙрд╕рдХреЗ рдмрд╛рдж рд╡рд┐рд░рд╛рд╕рдд-рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИ: рдкреНрд░рддрд┐рдмрд┐рдВрдм рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдЕрдм рдЧрд╛рдпрдм рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдХреЛрдб рдХреЛ рдФрд░ рднреА рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ service рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдкреЗрд╢ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЙрдкрдпреЛрдЧ рдЕрдм рд╣реИ: <strong i="22">@service</strong> export default class MyService extends Service<MyService> { async foo() { return this.someMethod(); } } , рдФрд░ рдпрд╣ рд╕рд┐рд░реНрдл рд╕рд╛рджрд╛ рдЕрдорд┐рддреНрд░ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рдереЛрдбрд╝реА рд╕реА рдЕрд╕реБрд╡рд┐рдзрд╛ред

рдЖрдк рд╕рдЪ рд╣реИрдВ рдХрд┐ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╢рдмреНрджрд╛рд░реНрде рд░реВрдк рд╕реЗ рд╕рдВрд╢реЛрдзрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдШреЛрд╖рд┐рдд рд╡рд░реНрдЧ рдХреЛ рддрддреНрдХрд╛рд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрдХреНрд╖рд╛ рдХреЗ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдареАрдХ рд╕реЗ рд╕рдорд░реНрдерди рди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣ рдХрднреА-рдХрднреА рдЕрд╢реБрджреНрдз рдХреЛрдб рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдЕрдЪреНрдЫреЗ рдЕрдЪреНрдЫреЗ рдХреЗ рд▓рд┐рдП)ред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрднреА рднреА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдХреНрд▓рд╛рд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЗрд╕реЗ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдЪреАрдиреА рд╣реИред рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╣реИ рдФрд░ рдЗрд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдореНрдпреВрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬрдм рдЖрдк рдХрд┐рд╕реА рдХреНрд▓рд╛рд╕ рдореЗрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрд▓рд╛рд╕ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдмрджрд▓реА рдЬрд╛рддреА рд╣реИред

рд╕рдЪ рдирд╣реАрдВ рд╣реИ, рдЬрдм рдЖрдк рдХрд┐рд╕реА рдХреНрд▓рд╛рд╕ рдореЗрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлрдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрд▓рд╛рд╕ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЪрд╛рд╣реЗ рдЖрдк рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░реЗрдВ рдпрд╛ рди рдХрд░реЗрдВред

@TomMarius рдЖрдк рдХреБрдЫ рдЕрдиреБрдмрдВрдз рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорд╛рди рдХрд╛ рдлрд╛рдпрджрд╛ рдЙрдард╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдпрд╣рд╛рдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред рдЖрдкрдХреЛ рдмрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

function service<T>(target: { new (): T & {[P in keyof T]: () => Promise<any> } }) { return target };

// Does not type check
const MyWrongService = service(class {
    foo() { return ""; }
})

// Type checks
const MyRightService = service(class {
    async foo() { return ""; }
})

рдХрдХреНрд╖рд╛ рдХреЗ рдЖрдВрддрд░рд┐рдХ рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рд╕реЗ рдЕрд╡рдЧрдд рд╣реЛрдиреЗ рдХреА рдмрд┐рд▓реНрдХреБрд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

@masaeedu рд╡рд╣ рдореЗрд░реА рдмрд╛рдд рдирд╣реАрдВ рдереАред рд╕рд░реНрд╡рд┐рд╕ рдбреЗрдХреЛрд░реЗрдЯрд░/рд╕рд░реНрд╡рд┐рд╕ рдХреНрд▓рд╛рд╕ рдХреБрдЫ рдирдП рдЧреБрдгреЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ, рдФрд░ рдпреЗ рд╣рдореЗрд╢рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдкрдиреЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рд░рд╛рд╕рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛/рдЪрд╛рд╣рддреАред

рдореИрдВрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рд╣реИред

@masaeedu рд╡реИрд╕реЗ, рдмрдпрд╛рди "рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдПрдХ рдореВрд▓ рд╡рд░реНрдЧ рд╕реЗ рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рджреЗрддрд╛ рд╣реИ" рдЧрд▓рдд рд╣реИ - рд╣рдо рджреЛрдиреЛрдВ рдиреЗ рдпрд╣рд╛рдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣рд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдПрдХ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдпрд╛ рд╕реАрдзреЗ рдореВрд▓ рд╡рд░реНрдЧ рджреЗрддрд╛ рд╣реИ, рдХрднреА рдирдпрд╛ рдирд╣реАрдВред

@TomMarius рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдиреЗ "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреЗрд╡рд▓ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ" рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣реА рд╡рд╣ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдерд╛ред рдпрд╣ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЕрдиреБрдмрдВрдз рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдХреЛрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╡рд╛рдкрд╕ рднреЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕рдЬрд╛рд╡рдЯреА рдХреЛ рдХреНрд▓рд╛рд╕ рдЗрдВрдЯрд░реНрдирд▓ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдкреНрд░рдХрд╛рд░-рдЖрдХрд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдХреЛрдб рдХреЛ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдорд╛рдирдХ рд╡рд┐рд░рд╛рд╕рдд рдпрд╛ рд╕рдВрд░рдЪрдирд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@ohjames рдХреЗрд╡рд▓ рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рдЧрд╛рдиреЗ рд╕реЗ рд╡рд░реНрдЧ рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреЗрдПрд╕ рд╢реБрджреНрдзрддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ рднреА рдХреЛрдИ рднреА рдмрдпрд╛рди рдХреБрдЫ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред рдПрдХ рдмрд╛рд░ рд╕реБрд╡рд┐рдзрд╛ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рднреА, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдкрдХреЛ рдХрд╛рд░реНрдп рдирд┐рдХрд╛рдпреЛрдВ рдХреЗ рднреАрддрд░ рдордирдорд╛рдиреЗ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

@masaeedu рдЖрдк рдмрд┐рдЯреНрд╕ рдЙрдард╛ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдмрдбрд╝реА рддрд╕реНрд╡реАрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдХреГрдкрдпрд╛ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдореЗрд░реА рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВ - рдореБрджреНрджрд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдореБрджреНрджреЛрдВ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдмрд▓реНрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдореБрджреНрджреЗ рдореЗрдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╡рд┐рд░рд╛рд╕рдд-рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕рдордЭрд╛рдпрд╛ - рдмрд╣реБрдд рд╕рд╛рд░реЗ рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рдбреБрдкреНрд▓рд┐рдХреЗрд╢рдиред

рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП "рдХреНрд▓реАрди рдХреЛрдб" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рд╕рдорд╕реНрдпрд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХрддрд╛ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ; рдпрджрд┐ рдЖрдк @foo рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рдорд╛рди рдорд╛рдирддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХреЛ рдЙрд╕рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЯрд╛рдЗрдк рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдХреАрдбрд╝реЗ рдХреЗ рдбрд┐рдмреНрдмреЗ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рд╕рд╛рде рд╣реА рдЯрд╛рдЗрдк рдЗрдВрдЯреНрд░реЗрдВрд╕ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдХреЛрдиреЛрдВ рдореЗрдВ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рд╕рднреА рдЬрд╛рджреБрдИ рдЬрд╛рдирд╡рд░реЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдпрд╣ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рддрд░рд╣ рдПрдХ рдмрдбрд╝реА рдмрд╛рдзрд╛ рдмрди рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЕрдм рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рд╣реИред

@TomMarius рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдЖрдкрдХреА рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгреА рд╕реНрд╡рдЪреНрдЫ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдЬреЛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИред рдЕрдЧрд▓реА рдЯрд┐рдкреНрдкрдгреА рдЗрд╕ рдСрдирд▓рд╛рдЗрди рд╕реЗрд╡рд╛ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рд╣реИред рдкреНрд░рд╛рдердорд┐рдХ рд╢рд┐рдХрд╛рдпрдд, рдкрд╣рд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рд╕реЗ рдЪреМрдереЗ рддрдХ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдХрд┐ MyService extends Service<MyService> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреИрд╕реЗ рд╣реЛрддреА рд╣реИред рдореИрдВрдиреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рдЖрдк рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рджреЗрдЦрд╛ рд╣реИ, рдФрд░ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдЬреЛ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдЬрд╛рдП рдЧрдП рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рд╕рдЬрд╛рд╡рдЯреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрди рдирдИ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ рдЬреЛ рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдорд╛рдирдХ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рд╛рде рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдореИрдВрдиреЗ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЙрд╕ рдкрд░ рд╕реНрдХрд┐рдореНрдб рдХрд┐рдпрд╛, рдореЗрд░реА рдорд╛рдлрд╝реАред

@masaeedu рдореИрдВ рдЗрд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рд╛рде рдкреВрд░рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рд░рд╛рд╕рдд рдореБрдЭреЗ/рдореЗрд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рдФрд░ рдореИрдВ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИред

рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ <strong i="7">@service</strong> class X { } рдЬрд╣рд╛рдВ service рдХреЛ <T>(target: T) => T & IService рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд╣ X рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ X & IService рд╣реИ; рдФрд░ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдХрдХреНрд╖рд╛ рдХреЗ рдЕрдВрджрд░ рднреА рд╕рдЪ рд╣реИ - рднрд▓реЗ рд╣реА рдпрд╣ рд╢рдмреНрджрд╛рд░реНрде рд░реВрдк рд╕реЗ рд╕рддреНрдп рди рд╣реЛред

рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдПрдХ рдФрд░ рдмрдбрд╝рд╛ рджрд░реНрдж рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдХреБрдЫ рдмрд╛рдзрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ, рддреЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рд▓рдХреНрд╖реНрдп рд╣рдореЗрд╢рд╛ рдореВрд▓ рд╡рд░реНрдЧ рд╣реЛрддрд╛ рд╣реИ, рд╕рдЬрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдмрд╛рдзрд╛ рдмреЗрдХрд╛рд░ рд╣реИред

рдореИрдВ рдЗрд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рд╛рде рдкреВрд░рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рд░рд╛рд╕рдд рдореБрдЭреЗ/рдореЗрд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдпрд╣ рд╡рд╣ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВред рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ IService рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ TheirService implements IService рднреА рдХреБрдЫ рдЕрдиреНрдп рдЕрдиреБрдмрдВрдз { [P in keyof blablablah] } рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдЖрдк рдпрд╣ рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ { potato: Potato } рд╣реЛ рдЙрдирдХреА рд╕реЗрд╡рд╛ рдкрд░ред рдХрдХреНрд╖рд╛ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ @service рд╕реЗ рдЕрд╡рдЧрдд рдХрд░рд╛рдП рдмрд┐рдирд╛ рдпрд╣ рд╕рдм рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ:

import { serviceDecorator, BaseService } from 'library';

// Right now
const MyService = serviceDecorator(class extends BaseService {
    async foo(): { return ""; }
})

const MyBrokenService1 = serviceDecorator(class extends BaseService {
    foo(): { return; } // Whoops, forgot async! Not assignable
});

const MyBrokenService2 = serviceDecorator(class { // Whoops, forgot to extend BaseService! Not assignable
    async foo(): { return; } 
});

// Once #4881 lands
<strong i="13">@serviceDecorator</strong>
class MyService extends BaseService {
    async foo(): { return ""; }
}

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдореЗрдВ рдХреБрдЫ рдмрдбрд╝реА рдЬреАрдд рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдХреЗрд╡рд▓ serviceDecorator рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ this рд╕реЗ foo рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рдзреНрд╡рдирд┐ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд░рдгрдиреАрддрд┐ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ? serviceDecorator рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рдЙрд╕ рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд╕рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЕрдм рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ...

рд╣рд╛рдп @masaeedu , рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдВ рддреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореВрд▓реНрдпрд╡рд╛рди рд╣реЛ рдЬрд╛рддреА рд╣реИред

@Component({ /** component args **/})
@Authorized({/** roles **/)
<strong i="7">@HasUndoContext</strong>
class MyComponent  {
  // do stuff with undo context, component methods etc
}

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХреЗрд╡рд▓ рд╡рд░реНрдЧ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИред рд╡рд┐рдзрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрддрдиреЗ рдЕрдЪреНрдЫреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред рдЪрд░рдг 2 рдореЗрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╣реИрдВ - https://github.com/tc39/proposal-decorators ред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдорд╛рдорд▓реЗ рдРрд╕реЗ рдереЗ рдЬрд┐рдиреНрд╣реЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдЙрди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдИрдВрдЯреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдереЗ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрддрдиреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдереЗ рдФрд░ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╕рдВрд╕реНрдХрд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреЗрдмреЗрд▓/рдЯреАрдПрд╕ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддреЛ рдпрд╣ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░рд┐рд▓реАрдЬ рддрдХ рдЕрдкрдиреА рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рдЦреЛрдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ "рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ" рдХреЗ рд▓рд┐рдП рд╣реИред

@pietschy рд╣рд╛рдВ, рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ рдХреЗ рд╕рд╛рде @ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪреАрдиреА рдХреЛ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдлрд┐рд▓рд╣рд╛рд▓ рдЖрдк рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

const decorator = compose(
    Component({ /** component args **/ }),
    Authorized({ /** roles **/ })
    HasUndoContext
);

const MyComponent = decorator(class {
});

рдкрд┐рдЫрд▓реА рдЪрд░реНрдЪрд╛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрд▓рдЯрд╛ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдЬрд╣рд╛рдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ this рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдХреНрд╖рд╛ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рд╛рдп @masaeedu , рд╣рд╛рдБ, рдореИрдВ рдЪрд░реНрдЪрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рд╕рдордЭ рдЧрдпрд╛, рдЗрд╕рд▓рд┐рдП // do stuff with undo context, component methods etc ред рдЪрд┐рдпрд░реНрд╕

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд┐рдХреНрд╕рд┐рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ) рдПрдХрд╛рдзрд┐рдХ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдорд┐рдХреНрд╕рд┐рдиреНрд╕ рдпрд╛ рдЯреНрд░реИрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдФрд░ рдЕрдм рдпрд╣ рдореБрдЭреЗ рдмрд╣реБрдд рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдореИрдВ рдХреБрдЫ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реВрдВред
рдФрд░ рдореБрдЭреЗ рд╣рд░ рдЬрдЧрд╣ рдЗрд╕рдХреЗ "рдЦрд╛рд▓реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди" рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред (#371)

--
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд░рд┐рдЯрд░реНрди рдЯрд╛рдЗрдк рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдХрдХреНрд╖рд╛ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХреНрдпреЛрдВрдХрд┐: .... рдПрдореНрдоред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдореЗрд░реЗ рдЦрд░рд╛рдм рдЕрдВрдЧреНрд░реЗрдЬреА рдХреМрд╢рд▓ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ ... (ЁЯдФ рдХреНрдпрд╛ рдХреЛрдИ рдлреЛрдЯреЛ рдмрд┐рдирд╛ рдлреЛрдЯреЛ рдлреНрд░реЗрдо рдХреЗ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?) рдпрд╣ рдХрд╛рдо рдПрдХ interface рдХреЗ рд▓рд┐рдП рд╣реИред

рдореИрдВ рдЗрд╕рдореЗрдВ рдЕрдкрдирд╛ +1 рдЬреЛрдбрд╝реВрдВрдЧрд╛! рдореИрдВ рдЗрд╕реЗ рдЬрд▓реНрдж рд╣реА рдЖрддреЗ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред

@pietschy рдпрджрд┐ рд╡рд░реНрдЧ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝реЗ рдЧрдП рд╕рджрд╕реНрдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рджреВрд╕рд░реА рддрд░рдлред рдЖрдкрдХреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

const decorator = compose(
    Component({ /** component args **/ }),
    Authorized({ /** roles **/ })
    HasUndoContext
);

class MyComponent extends decorator(class { }) {
    // do stuff with undo context, component methods etc
};

рд╡рд┐рдХрд▓реНрдк рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рддрд░реНрдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕рдХреЗ рддрд░реНрдХ рд╕реЗ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЗрд╕рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдЖрджрд┐ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдореЗрдВ рдЕрднреА рднреА рдПрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╕реНрддрд╛рд╡, рдпрд╣ рд╕рд┐рд░реНрдл рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рд╣рд╛рдп @masaeedu , рдореИрдВ рдЙрд▓рдЭрди рдореЗрдВ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рдЕрдкрдиреЗ рд╕рдЬрд╛рд╡рдЯреА рдХреНрдпреЛрдВ рд▓рд┐рдЦрдирд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рднреВрдорд┐ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рддрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рдкрд╣рд▓реЗ рд╣реА рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

function pressable<T extends {new(...args:any[]):{}}>(constructor:T) {
    return class extends constructor {
        pressMe() {
            console.log('how depressing');
        }
    }
}

<strong i="7">@pressable</strong>
class UserLandClass {
    constructor() {    
        this['pressMe'](); // this method exists, please let me use code completion.
    }
}

console.log(new UserLandClass());

рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рдзрд┐рдпрд╛рдВ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИрдВ рдФрд░ рд╡реИрдз рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ рддреЛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реЗред

рдЗрдЪреНрдЫрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрд┐рдирд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд▓рдЧрд╛рдП рдЗрд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реЗред рдЕрдЧрд░ рдЕрдиреНрдп рд╣реИрдВ
рдЪреАрдЬреЗрдВ рдЬреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореЙрдбрд▓рд┐рдВрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддреЛ рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣
рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рдХрд┐рд╕реА рдЖрдХрд╛рд░ рдпрд╛ рд░реВрдк рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдпрд╣ рдзрд╛рдЧрд╛ рдЗрд╕ рдмрд╛рдд рдкрд░ рд░рд╛рдп рд╕реЗ рднрд░рд╛ рд╣реИ рдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЛ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП , рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП , рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрджрд┐ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдорддрд▓реА ред

рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ:

function addMethod(Class) : any {
    return class extends Class {
        hello(){}
    };
}

<strong i="13">@addMethod</strong>
class Foo{
    originalMethod(){}
}

рдЬреЛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк esnext рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ

var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};

function addMethod(Class) {
    return class extends Class {
        hello() {
        }
    };
}
let Foo = class Foo {
    originalMethod() { }
};
Foo = __decorate([
    addMethod
], Foo);

рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдиреАрдЪреЗ рд╕реЗ рдКрдкрд░ рддрдХ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде __decorate рдХреЗ рд╕рд╛рде, рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдкрд╛рд╕ рдПрдХ рдкреВрд░реА рдирдИ рдХрдХреНрд╖рд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддрд╛ рд╣реИред

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╕рдорд░реНрдерди рдФрд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣рдо рд╕рднреА рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдКрдкрд░ рдХреЗ рдореВрд▓ рдХреЛрдб рдирдореВрдиреЗ рд╕реЗ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдиреЗ рдЗрд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдзрд╛рдЧрд╛, рдмрд╕ рдЧрд▓рдд рд╣реИ?

рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдпрд╛ рдорд┐рдХреНрд╕рд┐рдиреНрд╕ рдпрд╛ рдлрдВрдХреНрд╢рдирд▓ рдХрдВрдкреЛрдЬрд┐рд╢рди рдЖрджрд┐ рдЖрджрд┐ рдкрд░ рдХрд┐рд╕реА рднреА рдбреЗрд╡рд▓рдкрд░ рдХреА рд░рд╛рдп рдХреНрдпрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реНрдкрд╖реНрдЯ рдмрдЧ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред


рдХреНрдпрд╛ рдореИрдВ рд╡рд┐рдирдореНрд░рддрд╛ рд╕реЗ рдкреВрдЫ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рд╣реИ?

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрд╕ рдЕрджреНрднреБрдд рд╣реИ рдФрд░ рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИ; рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХреБрдЫ (рдХреЗрд╡рд▓?) рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреЛ рдмрд╕ рдЯреВрдЯрд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ рдореИрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реВрдВ :)

@arackaf рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдЬрд╛рд╡рдЯреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЖрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЙрддреНрд╕рд░реНрдЬрди рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдЬрд╛рд╡рдЯреА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдЕрдВрдХ рдореЗрдВ рдкреВрд░реА рдмрд╣рд╕ рдЗрд╕ рдмрд╛рдд рдХреЛ рд▓реЗрдХрд░ рд╣реИ рдХрд┐ рд╕рдЬрд╛рдП рдЧрдП рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреИрд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ new Foo().foo рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдПрдХ рдмрдЧ рд╣реИ, рдФрд░ рдЙрд╕ рдкрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ return this.foo; рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рд╣реЛрдирд╛ рдПрдХ рдмрдЧ рд╣реИред рдпрджрд┐ рдХреБрдЫ рднреА рд╣реЛ, рддреЛ рдЖрдк рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рдРрд╕реА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдкреВрдЫ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЕрднреА рддрдХ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдХрд┐рд╕реА рдиреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдорди рдореЗрдВ рдХреБрдЫ рддрдВрддреНрд░ рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдпреБрдХреНрдд рд╡рд░реНрдЧ рдкрд░ рд▓рд╛рдЧреВ рдбреЗрдХреЛрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ this рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рддрдВрддреНрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реБрдЭрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред

рдРрд╕рд╛ рддрдВрддреНрд░ рдЙрддрдирд╛ рддреБрдЪреНрдЫ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдЖрдк рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд▓рдЧрднрдЧ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рд╕реЗ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ addMethod new () => T new() => T & { hello(): void } #$ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдХрд┐ T рддрдм T & { hello(): void } рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП super.hello рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рдорд╛рдиреНрдп рд╣реИ?

рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ return class extends ClassIWasPassed { ... } рдХрд░рдиреЗ рддрдХ рд╣реА рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реВрдВ, рдореИрдВ рдЬреЛ рдЪрд╛рд╣реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ; рдШрдЯрд╛рд╡ рдкреНрд░рдХрд╛рд░, рдореИрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░, рд╕рдВрдШ, рд╡реЗ рд╕рднреА рдЙрдЪрд┐рдд рдЦреЗрд▓ рд╣реИрдВред рдХрд┐рд╕реА рднреА рдкрд░рд┐рдгрд╛рдореА рдкреНрд░рдХрд╛рд░ рдХреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЬрд╛ рд░рд╣реЗ рдЗрд╕ рдЕрдиреБрдорд╛рди рд▓реВрдк рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рдЦреЗрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

type Constructor<T> = new (...args: any[]) => T
type Greeter = { hello(): string }

function logger<T extends Constructor<Greeter>>(Class: T) {
    return class {
        hello() {
            console.log(new Class().hello()) // Do I get a type error here? After all, the signature of Class is { hello: () => void }
        } 
    };
}

// Or should I get the error here? Foo does not conform to { hello(): string }
<strong i="22">@logger</strong>
class Foo {
    hello() { return "foo"; }
}

рдЖрдк рдХреЗрд╡рд▓ "рдореБрд╢реНрдХрд┐рд▓" рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреВрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд┐рд╕реА рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ - рдЖрдк рд▓реЙрдЧрд░ рдХреЛ рдПрдХ рд╡рд░реНрдЧ рдкрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЧреНрд░реАрдЯрд░ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ; рд╣рд╛рд▓рд╛рдВрдХрд┐ рдлреВ рдХреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдм рдЧреНрд░реАрдЯрд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рддреЛ рдпрд╣ рд▓реЙрдЧрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдлреВ рдХреЛ рдЧреНрд░реАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдЕрдорд╛рдиреНрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдлреВ рдХреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрди: рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмреЗрд╣рдж рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕реВрдЪреАрдмрджреНрдз рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЙрдЪрд┐рдд рдЙрдкрд╕рдореБрдЪреНрдЪрдп рд╕рдВрднрд╡ рд╣реИ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдореБрд╢реНрдХрд┐рд▓ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рд╡рд┐рд▓рдп рдЬреИрд╕реЗ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╡рд┐рд▓рдп рдХреЗ рд╕рд╛рде?

@рдЕрд░рд╛рдХрд╛рдл

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдлреВ рдХреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ Foo рдХреНрдпрд╛ рд╣реИ рдЗрд╕рдХреА рдХреЛрдИ рд╕рдЯреАрдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдкреВрд░рд╛ рд╡рд┐рд╡рд╛рдж рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ Foo рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВ), рдбреЗрдХреЛрд░реЗрдЯрд░ рдиреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ this рд╕реЗ рдкреЗрд╢ рдХрд┐рдпрд╛ред Foo рдХреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреНрдпрд╛ рд░рд┐рдЯрд░реНрди рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ Foo рдХреНрдпрд╛ рд╣реИред рд╡реЗ рдЕрд╡рд┐рднрд╛рдЬреНрдп рд░реВрдк рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИрдВред

рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмреЗрд╣рдж рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЕрднреА рднреА рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рд╣реИ, рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдХреЛрдИ рдареЛрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рднреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ " this рдХрд╛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рд╕рдЬрд╛рд╡рдЯреА рдХреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реВрдВ" рдХреЗ рд▓рд┐рдП рдПрдХ рдареЛрд╕ рддрдВрддреНрд░ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВред рдлрд┐рд░ рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рднрд╛рдЧреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЬреЛ рд╕рд╛рдордиреЗ рдЖрддрд╛ рд╣реИ рд╡рд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рддрднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдбреЗрдХреЛрд░реЗрдЯрд░ рдЖрдЙрдЯрдкреБрдЯ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдКрдкрд░ рдЪрд┐рдкрдХрд╛рдпрд╛ рд╣реИ рд╡рд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИ? рдореИрдВрдиреЗ рдорд╛рди рд▓рд┐рдпрд╛ рдХрд┐ рдпрд╣ рдореИрдВрдиреЗ рдЬреЛ рджреЗрдЦрд╛ рд╣реИ рдЙрд╕рд╕реЗ рдерд╛ред

рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП, рдлреВ рдХрд╛ рд╣рд░ рдХрджрдо рдкрд░ рдХрд╛рдлреА рд╕рдЯреАрдХ рдЕрд░реНрде рд╣реИред рдореИрдВ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЯреАрдПрд╕ рдореБрдЭреЗ рдЕрдВрддрд┐рдо рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ this (рдлреВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЕрдВрджрд░ рдФрд░ рдлреВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЯреАрдПрд╕ рдиреЗ рдореБрдЭреЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдЯрд╛рдЗрдк рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рд╣реИ рдпрджрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИрдВред

@arackaf рдХреЛрдИ "рд░рд╛рд╕реНрддреЗ рдХреЗ рдХрджрдо" рдирд╣реАрдВ рд╣реИрдВ; рд╣рдо рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЗ this рд╕реЗ рдЪрд┐рдВрддрд┐рдд рд╣реИрдВред рдЖрдкрдХреЛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ this рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП X рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рд╕рдЬрд╛рдП рдЧрдП f1...fn рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред X рдФрд░ f1...fn рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ред рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЬрд┐рддрдиреЗ рдЪрд╛рд╣реЗрдВ рдЙрддрдиреЗ рдЪрд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм рддрдХ, рдХреЛрдИ рднреА рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдореИрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ this рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╕рднреА рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд╢рд╛рди рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВред

рдпрджрд┐ рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдпрд╛рдВрддреНрд░рд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓реНрдб рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдк рдЬреЛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕рдХреЗ рдмрдЬрд╛рдп рдореИрдВ рдЬреЛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЙрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ: рдпрд╛рдиреА new Foo().hello() рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди this.hello() рдирд╣реАрдВ рд╣реИред рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрд┐рд╕реА рднреА рдмрд┐рдВрджреБ рдкрд░ рдЖрдк рдЬрд┐рд╕ рдореВрд▓ рд╡рд░реНрдЧ рдХреЛ рд╕рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ hello рд╡рд┐рдзрд┐ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреЗрд╡рд▓ __decorate([addMethod], Foo) (рдЬреЛ рддрдм Foo рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ) рдХреЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ hello рд╡рд┐рдзрд┐ рд╣реИред

рдореИрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

рдУрд╣, рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд╣рд╛рдБ, рдпрд╣ рд╕рд╣реА рд╣реИред рдареАрдХ рд╣реИ рдХрд┐ред рдкреВрд░реНрдг рд╡рд┐рд░рд╛рдоред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣реА рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд▓рд╛рдЗрди рдореЗрдВ рдЕрдВрддрд┐рдо рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреБрдЫ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдпрд╛ рд╡рд░реНрдЧ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдлреВ рд╣реИред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ:

<strong i="9">@c</strong>
<strong i="10">@b</strong>
<strong i="11">@a</strong>
class Foo { 
}

рдлреВ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рд╣реИ c рдХрд╣рддрд╛ рд╣реИ рд╡рд╣ рд╣реИред рдпрджрд┐ c рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ any рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ - рд╢рд╛рдпрдж рдореВрд▓ Foo рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдП? рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд, рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ c рдХреБрдЫ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ X $ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлреВ рд╕реЗ рдЗрд╕рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВред

рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рднреВрд▓ рд░рд╣рд╛ рд╣реВрдБ?


рдЖрдЧреЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рддреЗ рд╣реБрдП, рдпрджрд┐

class X { 
    hello() {}
    world() {}
}
function c(cl : any) : X {  // or should it be typeof X ?????
    //...
}

<strong i="25">@c</strong>
<strong i="26">@b</strong>
<strong i="27">@a</strong>
class Foo { 
    sorry() {}
}

new Foo().hello(); //perfectly valid
new Foo().sorry(); //ERROR 

рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рднреВрд▓ рд░рд╣рд╛ рд╣реВрдБ?

@arackaf рд╣рд╛рдВ, рдпрд╣ рднреЛрд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреНрдпрд╛ рдЧрд╛рдпрдм рд╣реИ рдХрд┐ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдордирдорд╛рдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдХрд┐ рдкрд░рд┐рдгрд╛рдо Foo рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реЛред

рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдк рдХрд┐рддрдиреА рднреА рдмреЗрддреБрдХреА рдмрд╛рддреЗрдВ рдкреИрджрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдореИрдВ this рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ c this рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреА рдкрд░рд┐рдкрддреНрд░рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреА рдЖрдкрддреНрддрд┐ рдХреЛ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рдХрд┐ this рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ c рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред

type Constructor<T> = new (...args: any[]) => T
type Greeter = { hello(): string }

function logger<T extends Constructor<Greeter>>(Class: T) {
    return class {
        hello() {
            console.log(new Class().hello())
        }
    };
}


<strong i="15">@logger</strong>
class Foo {
    foo() { return "bar" }
    // Whoops, `this` is `{ hello(): void }`, it has no `foo` method
    hello() { return this.foo(); }
}

рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╛ рддреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реМрдореНрдп рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░реЗрдВ рдХрд┐ this рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╣реЛред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИред @logger рдиреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА foo рдкрджреНрдзрддрд┐ рдХреЗ, рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдИ hello() рдкрджреНрдзрддрд┐ рдХреЗ рд╕рд╛рде, рдЬреЛ рдореВрд▓, рдЕрдм-рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ, рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдмрд┐рд▓реНрдХреБрд▓ рдирдИ рдХрдХреНрд╖рд╛ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рд╣реИред Foo ред

new Foo().foo()

рдЕрдм рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ; рдпрд╣ рдПрдХ рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред рдореИрдВ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рд╕рдВрдХрд▓рди-рд╕рдордп рддреНрд░реБрдЯрд┐ рднреА рдЙрддреНрдкрдиреНрди рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдпрджрд┐ рдЙрди рд╕рднреА рдХрд╛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реИ, рддреЛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ logger рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдиреЛрдЯреЗрд╢рди рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ Foo рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕реЗ рдкрд┐рдЫрдбрд╝рд╛ рд╕рдВрдЧрдд рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

@arackaf рдЯрд╛рдЗрдкрд┐рдВрдЧ рдпрд╛ рд░рдирдЯрд╛рдЗрдо рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ new Foo().hello() рдкрд░ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдЬрд╛рдП рдЧрдП рд╡рд░реНрдЧ рдХреЗ hello рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рдЬреЛ рд╕рдЬрд╛рдП рдЧрдП рд╡рд░реНрдЧ рдХреЗ bar рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред рдореЗрд░реЗ рд▓рд┐рдП рдореВрд▓ рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░ bar рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░рдирд╛ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИред

рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рдЗрд╕ рдкреВрд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЪрд▓рд╛рдХрд░ рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдЖрдЬрдорд╛ рд╕рдХрддреЗ рд╣реИрдВ:

// Code from previous snippet...

const LoggerFoo = logger(Foo)
new LoggerFoo().hello()

рдЬрд╝рд░реВрд░ - рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рдпрд╣ рдЖрд╣реНрд╡рд╛рди рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдереА

new Foo().foo()

рдЯрд╛рдЗрдкрд┐рдВрдЧ рдпрд╛ рд░рдирдЯрд╛рдЗрдо рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдирдпрд╛ рдлреВ ()ред рд╣реИрд▓реЛ () рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдЬрд╛рдП рдЧрдП рд╡рд░реНрдЧ рдХреЗ рд╣реИрд▓реЛ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рдЬреЛ рд╕рдЬрд╛рдП рдЧрдП рд╡рд░реНрдЧ рдХреЗ рдмрд╛рд░ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛

рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╣рдирд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП

let s : string = new Foo().hello();

рдЪреВрдВрдХрд┐ рдлреВ рдХреА рд╣реИрд▓реЛ рд╡рд┐рдзрд┐ рдЕрдм рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рд░рд┐рдЯрд░реНрди рдХреА рдХрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рддреА рд╣реИред

рдЬрд╝рд░реВрд░ - рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ new Foo().foo() . рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░рдирд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рдереА

@arackaf рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред рдореИрдВрдиреЗ new Foo().foo() рдЖрд╣реНрд╡рд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ this.foo() рдЖрд╣реНрд╡рд╛рди рдХрд┐рдпрд╛, рдФрд░ рдореБрдЭреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА, рднрд▓реЗ рд╣реА рдореЗрд░рд╛ рдХреЛрдб рд░рдирдЯрд╛рдЗрдо рдкрд░ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди let s : string = new Foo().hello() . рдХрд╣рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП

рдлрд┐рд░, рдпрд╣ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ Foo.prototype.hello () => string рдЪрд╛рд╣рд┐рдП (рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ () => void рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдореИрдВ рд╡реИрдз рдЖрдордВрддреНрд░рдг this.bar() рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рд╢рд▓реНрдп рдЪрд┐рдХрд┐рддреНрд╕рд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рдХрд┐рдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рдХрд░рдирд╛ рдмреЗрдорд╛рдиреА рд╣реИред

рдпрд╣рд╛рдБ рджреЛ рдлреВ рд╣реИрдВред рдЬрдм рдЖрдк рдХрд╣реЗрдВ

class Foo { 
}

рдлреВ рдХрдХреНрд╖рд╛ рдХреЗ рднреАрддрд░ рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдмрдВрдзрди рд╣реИ, рдФрд░ рдХрдХреНрд╖рд╛ рдХреЗ рдмрд╛рд╣рд░ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдмрдВрдзрди рд╣реИред рддреЛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдПрдХ jsbin рдореЗрдВ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

class Foo { 
  static sMethod(){
    alert('works');
  }
  hello(){ 
    Foo.sMethod();
  }
}

let F = Foo;

Foo = null;

new F().hello();

рдЙрдкрд░реЛрдХреНрдд рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ; рдмрд╛рд╣рд░реА рдмрд╛рдзреНрдпрдХрд╛рд░реА рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдореВрд▓ рд╡рд░реНрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдЕрдм рднреА рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВред

this.foo(); рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдиреНрдп рд╣реИ, рдФрд░ рдореБрдЭреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реЛрдЧреА (рдпрджрд┐ рдореБрдЭреЗ рдХрд┐рд╕реА рд╕рдВрджрд░реНрдн рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдореИрдВ рдЯреАрдПрд╕ рд▓реЛрдЧреЛрдВ рдХреЛ рднреА рджреЛрд╖ рдирд╣реАрдВ рджреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдХрдард┐рди рд╣реЛрдЧрд╛)

this.foo(); рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдиреНрдп рд╣реИ, рдФрд░ рдореБрдЭреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реЛрдЧреА

рдЕрдЪреНрдЫрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рд╣рдордд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрдм рдЖрдкрдХреЛ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдпреЛрдЧреНрдп рдпрд╛ рдЦрд╛рд░рд┐рдЬ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ this рдбреЗрдХреЛрд░реЗрдЯрд░ рдЬреЛ рдХреБрдЫ рднреА рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЙрд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдХрд╛рд░ рд╣реЛред рдпрджрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рддреЛ рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ { hello(): void } рдХреЗ рдмрдЬрд╛рдп this рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

this рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рддрддреНрдХрд╛рд▓ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

<strong i="7">@c</strong>
class Foo{
}

new Foo(). // <---- this is based on whatever c returned 

function c(Cl){
    new Cl().  // <----- this is an object whose prototype is the original Foo's prototype
                   // but for TS's purpose, for type errors, it'd depend on how Cl is typed
}

рдХреНрдпрд╛ рд╣рдо рдХреГрдкрдпрд╛ рдПрдХ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЯрд┐рдХреЗ рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВ? рдЗрд╕рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ:

type Constructor<T> = new (...args: any[]) => T
type Greeter = { hello(): string }

function logger<T extends Constructor<Greeter>>(Class: T) {
    return class {
        hello() {
            console.log(new Class().hello())
        }
    };
}

<strong i="6">@logger</strong>
class Foo {
    foo() { return "bar" }
    hello() { return this.foo(); } /// <------
}

this рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ? рдпрджрд┐ рдпрд╣ { hello(): void } рд╣реИ, рддреЛ рдореБрдЭреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА, рдХреНрдпреЛрдВрдХрд┐ foo { hello(): void } рдХрд╛ рд╕рджрд╕реНрдп рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдпрд╣ { hello(): void } рдирд╣реАрдВ рд╣реИ, рддреЛ this рдХреЗрд╡рд▓ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ this рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рднреА рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реНрдХ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕реЗ рд╕рдордЭрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: Foo рдкрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЬреЛрдбрд╝рдирд╛ рднреВрд▓ рдЧрдПред рд╕реНрдерд┐рд░ред

this , рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рддреАрд░ рд╣реИрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореВрд▓ Foo рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЯрд╛рдЗрдк рдПрд░рд░ рдирд╣реАрдВ рд╣реИред

рдЖрд╣ - рдореИрдВ рдЕрдм рддреБрдореНрд╣рд╛рд░реА рдмрд╛рдд рджреЗрдЦрддрд╛ рд╣реВрдБ; рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХрд╣рд╛рдБ рд╣реИред this.foo() рдореВрд▓ рдлреВ рдХреЗ рднреАрддрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ - рдЬреЛ рдХрд┐ (рдЕрдм рдкрд╣реБрдВрдЪ рд╕реЗ рдмрд╛рд╣рд░) рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╣реИ рдЬреЛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реБрдЖ рдХрд░рддреА рдереА Foo ред

рдпрд╣ рдПрдХ рдЕрдЬреАрдмреЛрдЧрд░реАрдм, рдордЬреЗрджрд╛рд░ рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЯреАрдПрд╕ рдХреЛ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╡рд░реНрдЧ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рд╕реЗ рдХреНрдпреЛрдВ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рд┐рдПред

@arackaf рдЖрдк рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗ рд░рд╣реЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ this рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ? рдЖрдк рдЕрдВрддрд╣реАрди рд░реВрдк рд╕реЗ рдЙрддреНрддрд░ рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗ " this is Foo рдФрд░ Foo is this "ред this рдореЗрдВ рдХреМрди рд╕реЗ рд╕рджрд╕реНрдп рд╣реИрдВ? рдпрджрд┐ рдЗрд╕рдореЗрдВ hello(): void рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рд╕рджрд╕реНрдп рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ?

рдЬрдм рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ " this.foo() рдореВрд▓ рдлреВ рдХреЗ рднреАрддрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ", рддреЛ рдЖрдкрдХреЛ рдЕрднреА рднреА рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: this рдХрд╛ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ this.foo() рдХрд░реЛ?

рд╕рд╛рде рд╣реА, рдореВрд▓ рд╡рд░реНрдЧ "рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп" рдирд╣реАрдВ рд╣реИред рдЙрд╕ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕рдм рдмрд┐рдирд╛ рдХрд┐рд╕реА рд░реЛрдХ-рдЯреЛрдХ рдХреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд▓рд┐рдВрдХ рдЪрд▓рд╛рдПрдВ рдФрд░ рдХрдВрд╕реЛрд▓ рдХреЛ рджреЗрдЦреЗрдВред рдбреЗрдХреЛрд░реЗрдЯрд░ рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ hello рд╡рд┐рдзрд┐ рдбреЗрдХреЛрд░реЗрдЯреЗрдб рдХреНрд▓рд╛рд╕ рдХреА hello рд╡рд┐рдзрд┐ рдХреЛ рджрд░реНрд╢рд╛рддреА рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рд╕рдЬрд╛рдП рдЧрдП рд╡рд░реНрдЧ рдХреА foo рд╡рд┐рдзрд┐ рдХреЛ рджрд░реНрд╢рд╛рддреА рд╣реИред

рдпрд╣ рдПрдХ рдЕрдЬреАрдмреЛрдЧрд░реАрдм, рдордЬреЗрджрд╛рд░ рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЯреАрдПрд╕ рдХреЛ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╡рд░реНрдЧ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рд╕реЗ рдХреНрдпреЛрдВ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреЛрдИ "рдЯреНрд░рд┐рд╡рд┐рдпрд╛" рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ TSC-1234 "рд╢рд░рд╛рд░рддреА рд▓рдбрд╝рдХрд╛, рдЖрдк рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ" рдЯрд╛рдЗрдк рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдорд┐рд▓рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред рдпрджрд┐ рдХреЛрдИ рд╕реБрд╡рд┐рдзрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдХреЛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ рддреЛрдбрд╝рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрди рд░рд╣реА рд╣реИ, рддреЛ рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЖрдкрдХреЛ TSC-1234 "рд╢рд░рд╛рд░рддреА рд▓рдбрд╝рдХрд╛, рдЖрдк рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ" рдЯрд╛рдЗрдк рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдорд┐рд▓рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред

рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореБрдЭреЗ рддрдм рдорд┐рд▓рддрд╛ рд╣реИ рдЬрдм рдореИрдВ рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдХрдХреНрд╖рд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрдХреНрд╖рд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд╛ рдЬреЛрдбрд╝рдХрд░, рдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, any рдЖрджрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред

рдореИрдВрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ this рдХреНрдпрд╛ рд╣реИ, рдФрд░ рдХрд╣рд╛рдБ рд╣реИред

рдЗрд╕ рдорд╛рдорд▓реЗ рдХрд╛ рд╕рд╛рдзрд╛рд░рдг рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ this рдХрд╛ рдЕрд░реНрде рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд╣рд╛рдВ рд╣реИрдВред

type Constructor<T> = new (...args: any[]) => T
type Greeter = { hello(): string }

function logger<T extends Constructor<Greeter>>(Class: T) {
    return class {
        hello() {
            console.log(new Class().hello())
        }
    };
}

class Foo {
    foo() { return "bar" }
    hello() { return this.foo(); } /// <------
}

const LoggableFoo = logger(Foo)
new LoggableFoo().hello() // Logs "bar"

рдЬрдм рдЖрдк new Class() рдХрд╣рддреЗ рд╣реИрдВ - рдХреНрд▓рд╛рд╕ рдореВрд▓ рдлреВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╕реЗ рдЗрд╕рдХреА рдкрд╣реБрдВрдЪ hello(): string рддрдХ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдХреНрд▓рд╛рд╕ рдХреЛ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЧреНрд░реАрдЯрд░ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ)ред рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЖрдк рдореВрд▓ рдлреВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рддреБрд░рдВрдд рдЪрд╛рд▓реВ рдХрд░ рджреЗрдВрдЧреЗред

new LoggableFoo().hello() рдПрдХ рд╢реВрдиреНрдп рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЕрдиреНрдпрдерд╛ рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ, рдЧреНрд░реАрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдЧрд░ рдЖрдкрдиреЗ рдХрд┐рдпрд╛ рд╣реЛрддрд╛

<strong i="21">@logger</strong>
class Foo {
    foo() { return "bar" }
    hello() { return this.foo(); }
}

рддреЛ рдлреВ рдЕрдм рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рд╣реИрд▓реЛ (): рд╢реВрдиреНрдп рдФрд░ рдирдпрд╛ рдлреВ ()ред рдлреВ () рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдФрд░, рдлрд┐рд░ рд╕реЗ, hello() { return this.foo(); } рдПрдХ TypeError рдирд╣реАрдВ рд╣реИ - рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрдЧрд╛? рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╡рд╣ рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдЕрдм рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЙрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЕрдорд╛рдиреНрдп рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рд╣реА рдХрд░реЗрдЧрд╛; рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдпрд╣рд╛рдВ рдФрд░ рд╡рд╣рд╛рдВ рдЯрд╛рдЗрдк рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝рдирд╛ рдХрд╛рдлреА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЙрджрд╛рд╣рд░рдг рдпрд╣ рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ @logger рдореВрд▓ рд░реВрдк рд╕реЗ рдЙрд╕ рдЪреАрдЬрд╝ рдХреЛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП Foo рдмрд╛рдзреНрдп рд╣реИред

рдпрджрд┐ logger рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рджреЗрддрд╛ рд╣реИ, рддреЛ рдлреВ рдЕрдм рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рд╣рд░ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдХрд╣рд╛рдВ рд╣реИред
рдЗрд╕ рдорд╛рдорд▓реЗ рдХрд╛ рд╕рд╛рдзрд╛рд░рдг рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЬрд╣рд╛рдВ рд╣реИрдВ, рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ this рдХрд╛ рдЕрд░реНрде рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд╣реИред рдареАрдХ рд╣реИ, рдпрд╣ рдмрджрд▓рддрд╛ рд╣реИ, рдпрд╣ Foo рд╣реИ, рдпрд╣ рдПрдХ рд╕реНрдерд┐рд░ рдмрдВрдзрди рд╣реИ, рдЗрддреНрдпрд╛рджрд┐ рдЗрддреНрдпрд╛рджрд┐ред рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ? this рдореЗрдВ рдХреМрди рд╕реЗ рд╕рджрд╕реНрдп рд╣реИрдВ? рдЖрдк рд╕реВрд░рдЬ рдХреЗ рдиреАрдЪреЗ рд╕рдм рдХреБрдЫ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрдм рдореБрдЭреЗ рдЖрдкрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЪрд╛рд╣рд┐рдП рдЬреЛ this рдХреЗ рдЕрдВрджрд░ рд╣реИ hello ред

new LoggableFoo().hello() рдПрдХ рд╢реВрдиреНрдп рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЕрдиреНрдпрдерд╛ рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ, рдЧреНрд░реАрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рдЕрдЧрдореНрдп рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рд╡рд┐рдзрд┐ "рдЕрдиреНрдпрдерд╛ рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ" рдЬрдм рдЖрдк рдЙрди рдкрдереЛрдВ рдХреЛ рдЫреВрдЯ рджреЗрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╣ рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рд╣реИред

рдпрджрд┐ рдЖрдкрдиреЗ рдХрд┐рдпрд╛ рдерд╛:

рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдЪрдореБрдЪ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ рд╣реИред рдареАрдХ рдпрд╣реА рдореЗрд░рд╛ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдЪрд┐рдкрдХрд╛рдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдЪреЗрдХрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рдЗрд╕реЗ рдЪрд▓рд╛рдпрд╛ рдХрд┐ рдореИрдВ рдкрд╛рдЧрд▓ рдЧреЛрд▓рд┐рдпрд╛рдВ рдирд╣реАрдВ рд▓реЗ рд░рд╣рд╛ рдерд╛, рдФрд░ рдХреЗрд╡рд▓ рдЕрдВрддрд░ рд╣реА рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдЯрд╛рдИ рдЧрдИ рдЯрд┐рдкреНрдкрдгреА рд╣реИред

рдФрд░, рдлрд┐рд░ рд╕реЗ, hello() { return this.foo(); } рдПрдХ TypeError рдирд╣реАрдВ рд╣реИ - рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрдЧрд╛?

рдХреНрдпреЛрдВрдХрд┐ рдЖрдк (рдФрд░ рдпрд╣рд╛рдВ рдЕрдиреНрдп) рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ this рдХрд╛ рдкреНрд░рдХрд╛рд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рддрддреНрдХрд╛рд▓ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рд╣реЛ, рдЬреЛ { hello(): void } рд╣реИ ( foo рд╕рджрд╕реНрдп рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ)ред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ Foo рдХреЗ рд╕рджрд╕реНрдп this рдХреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦ рд╕рдХреЗрдВ, рддреЛ this рдХреЗ рдЕрдВрджрд░ hello рдХрд╛ рдкреНрд░рдХрд╛рд░ { hello(): void } рд╣реЛрдЧрд╛ { hello(): void } рд╣реИ, рддреЛ рдореБрдЭреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред рдЕрдЧрд░ рдореБрдЭреЗ рдЯрд╛рдЗрдк рдПрд░рд░ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рджреБрдЦреА рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ рдХреЛрдб рдареАрдХ рдЪрд▓рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ this рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдпреЛрдЬрдирд╛ рдХреЛ рдЫреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВред this рдХрд╛ рдкреНрд░рдХрд╛рд░ рддрдм { hello(): string; bar(): string } рд╣реИ, рднрд▓реЗ рд╣реА рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреНрдпрд╛ рд▓реМрдЯрд╛рдПред рдЖрдкрдХреЗ рдкрд╛рд╕ this рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡реИрдХрд▓реНрдкрд┐рдХ рдпреЛрдЬрдирд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреЛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐, рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдЪрд▓рдиреЗ рдХреЗ рдмрд╛рдж, Foo рдореВрд▓ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЧрдИ рдЪреАрдЬрд╝реЛрдВ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗ рд╕рдХрддрд╛ рд╣реИред

function a(C){
    return class {
        x(){}
        y(){}
        z(){}
    }
}

<strong i="7">@a</strong>
class Foo {
    a(){ 
        this.b();  //valid
    }
    b() { 
        this.c();  //also valid
    }
    c(){ 
        return 0;
    }
}

let f = new Foo();
f.x(); //valid
f.y(); //also valid
f.z(); //still valid

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ this рдореЗрдВ рдХреБрдЫ рдЕрдЬреАрдмрддрд╛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рдЬреЛ рдКрдкрд░ рдлреВ рдХреЗ рдЕрдВрджрд░ рдХреБрдЫ рдЕрд▓рдЧ рд╣реИ, рдпрд╣ рдЙрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╣реИ рдЬреЛ рдмрд╛рдж рдореЗрдВ Foo рд╕реЗ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ (рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рдЪрд▓рдиреЗ рдХреЗ рдмрд╛рдж)?

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдЖрдкрдХреЛ рдХреНрдпрд╛ рдмрддрд╛рдКрдВ; рдбреЗрдХреЛрд░реЗрдЯрд░ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдореЗрд░рд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реНрдХ рдпрд╣ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЬреЛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рдХрдЯрддрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕реЗ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, (рдореВрд▓) рдлреВ рдХреЗ рдЕрдВрджрд░ рдЯрд╛рдЗрдк рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдлреВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрд▓рдЧ рд╣реЛрдВрдЧреЗ/рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рдЪрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВред

рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛ рд╕реЗ рдПрдХ рд╕рд╛рджреГрд╢реНрдп рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдЬрд╛рдП рдЧрдП Foo рдХреЗ рдЕрдВрджрд░ рдпрд╣ рдПрдХ рд╕реА # рдЕрдирд╛рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдордХрдХреНрд╖ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдЧрд╛-рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░, рдЬреЛ рдЕрдиреНрдпрдерд╛ рдорд╛рдиреНрдп рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реАрдзреЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИред рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ рдЧреИрд░-рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдЬреАрдм рд▓рдЧреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реЗ, рдпрд╣ рдареАрдХ рдЗрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдЬреАрдмреЛрдЧрд░реАрдм рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЬрдмрд░рджрд╕реНрдд рддрд╛рдХрдд рджреЗрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЙрдкрд░реЛрдХреНрдд рдлреВ рдХреЗ рдЕрдВрджрд░ рдХреБрдЫ рдЕрд▓рдЧ рд╣реЛрдиреЗ рдореЗрдВ рдХреБрдЫ рдЕрдЬреАрдмрддрд╛ рдорд┐рд▓рддреА рд╣реИ, рдпрд╣ рдЙрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╣реИ рдЬреЛ рдмрд╛рдж рдореЗрдВ рдлреВ рдЕрдВрддрддрдГ (рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рдЪрд▓рдиреЗ рдХреЗ рдмрд╛рдж) рд╕реЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ?

рдирд╣реАрдВ, рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╡рд┐рдЪрд┐рддреНрд░рддрд╛ рдирд╣реАрдВ рд▓рдЧрддреА, рдХреНрдпреЛрдВрдХрд┐ рдареАрдХ рдпрд╣реА рдореИрдВ 200 рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдХреНрдпрд╛ рдЖрдкрдиреЗ рдкрд┐рдЫрд▓реА рдЪрд░реНрдЪрд╛ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдкрдврд╝рд╛ рдерд╛?

рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕реНрдирд┐рдкреЗрдЯ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧреИрд░-рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╣реИред рдЬрд┐рди рд▓реЛрдЧреЛрдВ рд╕реЗ рдореИрдВ рдЕрд╕рд╣рдордд рдерд╛, рдФрд░ рдЬрд┐рдирдХреА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрдк рдХреВрдж рдкрдбрд╝реЗ, рд╡реЗ рднреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

function a(C){
    return class {
        x(){}
        y(){}
        z(){}
    }
}

<strong i="10">@a</strong>
class Foo {
    a(){ 
        this.b();  //valid
    }
    b() { 
        this.c();  //also valid
    }
    c(){ 
        return 0;
    }
    d(){
        // HERE: All of these are also expected to be valid
        this.x();
        this.y();
        this.z();
    }
}

let f = new Foo();
f.x(); //valid
f.y(); //also valid
f.z(); //still valid

рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдкреВрд░реА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдРрд╕рд╛ рд╕реБрдЭрд╛рд╡ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдореЗрд░реЗ рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореИрдВ this рд╕рджрд╕реНрдпреЛрдВ рдХреА рдПрдХ рд╡реНрдпрд╛рдкрдХ рд╕реВрдЪреА рдирд╣реАрдВ рдирд┐рдХрд╛рд▓ рд╕рдХрддрд╛, рдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд╣рдд рдЗрд╕ рддрд░рд╣ рдХреА рд╕реВрдЪреА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕реЗ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, (рдореВрд▓) рдлреВ рдХреЗ рдЕрдВрджрд░ рдЯрд╛рдЗрдк рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдлреВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрд▓рдЧ рд╣реЛрдВрдЧреЗ/рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рдЪрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВред

рддреЛ рддреБрдо рдореБрдЭрд╕реЗ рдмрд╣рд╕ рднреА рдХреНрдпреЛрдВ рдХрд░ рд░рд╣реЗ рд╣реЛ? рдореИрдВрдиреЗ рдХрд╣рд╛: "рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ new Foo().foo рдЯрд╛рдЗрдк рдПрд░рд░ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдПрдХ рдмрдЧ рд╣реИ, рдФрд░ рдЙрд╕ рдкрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рддрдп рд╣реЛ рдЧрдпрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рд▓реМрдЯрд╛рдПрдВред рдЯрд╛рдЗрдк рдПрд░рд░ рд╣реЛрдирд╛ рдПрдХ рдмрдЧ рд╣реИ"ред рд╕рдорд╛рди рд░реВрдк рд╕реЗ, рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ new Foo().x() рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рд╣реЛрдирд╛ рдПрдХ рдмрдЧ рд╣реИ, рд▓реЗрдХрд┐рди this.x() рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рд╣реЛрдирд╛ рдирд╣реАрдВ рд╣реИред

рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдкреГрд╖реНрда рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ рджреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдХреИрд╕реЗ рд╣реИрдВ?

        return this.foo; // Property 'foo' does not exist on type 'Foo'

^ рд╡рд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд▓рдЧрддрд╛ рд╣реИред рдпрд╛ рддреЛ рдЖрдк рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ this рдкрд░ рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдХреЗрд╡рд▓ new Foo() рдкрд░, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рджреЛрдиреЛрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╛ рдЖрдк рд╕рд╣рдордд рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдЙрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдРрд╕реЗ рдореЗрдВ рдЖрдкрдХреА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд╕реНрдирд┐рдкреЗрдЯ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред

рдореИрдВ рдЕрдВрдд рдореЗрдВ рдЖрдкрдХреА рдмрд╛рдд рд╕рдордЭ рдЧрдпрд╛ред рдЖрдкрдХреЗ рдЧреНрд░реАрдЯрд┐рдВрдЧ рдХреЛрдб рд╕реЗ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдард┐рди рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рдЯреНрд░реИрдХ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ; рдЗрддрдиреЗ рдзреИрд░реНрдпрд╡рд╛рди рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдПрдХрдорд╛рддреНрд░ рд╕рдордЭрджрд╛рд░ рд╕рдорд╛рдзрд╛рди рдлреВ (рдлреВ рдХреЗ рдЕрдВрджрд░ ) рдкреНрд░рдХрд╛рд░ рд╕рдВрдШ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ - рдбреАрдЖрд░рдкреА рдореЗрд░рд╛ рдорддрд▓рдм рдЪреМрд░рд╛рд╣реЗ - рдореВрд▓ рдлреВ рдХрд╛ рд╣реИ, рдФрд░ рдЬреЛ рднреА рдЕрдВрддрд┐рдо рд╕рдЬрд╛рд╡рдЯреА рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЕрднрд┐рд╡рд╛рджрди рдЬреИрд╕реЗ рдкрд╛рдЧрд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдореВрд▓ Foo рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЖрдкрдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдВрддрд┐рдо рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ рд╣реИ (рдЙрдкрд░реЛрдХреНрдд рдХрдИ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░)ред

рддреЛ рд╣рд╛рдБ, рдореЗрд░реЗ рд╕рдмрд╕реЗ рд╣рд╛рд▓рд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдг рд╕реЗ, Foo x, y, z, a, b, c рдХреЗ рдЕрдВрджрд░ рд╕рднреА рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ a рдХреЗ рджреЛ рд╕рдВрд╕реНрдХрд░рдг рдереЗ, рддреЛ рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВред

@arackaf np, рдЖрдкрдХреЗ рдзреИрд░реНрдп рдХреЗ рд▓рд┐рдП рднреА рдзрдиреНрдпрд╡рд╛рджред рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рдкрдХрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдЙрд╕реЗ рдкреЛрд╕реНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдЯреВрдЯрд╛ рд╣реБрдЖ рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ рд╕реЛрдЪрдирд╛ рдХрдард┐рди рд╣реИред

рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдореВрд▓ рдлреВ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕рдВрдШ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреВ (рдлреВ рдХреЗ рдЕрдВрджрд░) рдХреЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ рд╕рдордЭрджрд╛рд░ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛, рдФрд░ рдЬреЛ рднреА рдЕрдВрддрд┐рдо рд╕рдЬрд╛рд╡рдЯреА рд▓реМрдЯрддрд╛ рд╣реИред

рдареАрдХ рд╣реИ рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛, рддреЛ рдЕрдм рд╣рдо рдЗрд╕рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдореЗрдВ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдЕрдЧрд░ рдореБрдЭреЗ рдпрд╣ рдЧрд▓рдд рд▓рдЧ рд░рд╣рд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рд╕реБрдзрд╛рд░реЗрдВ, рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк "рд╕рдВрдШ" рдХрд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рджрд╕реНрдп рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдпрд╛рдиреА рдпрд╣ A & B рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ this typeof(new OriginalClass()) & typeof(new (decorators(OriginalClass))) рд╣реЛ, рдЬрд╣рд╛рдВ decorators рд╕рднреА рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдХрдВрдкреЛрдЬреНрдб рдЯрд╛рдЗрдк рд╕рд┐рдЧреНрдиреЗрдЪрд░ рд╣реИред рд╕рд╛рджреЗ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ this "рдореВрд▓ рд╡рд░реНрдЧ" рдХреЗ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рд╣реЛ рдФрд░ "рдореВрд▓ рд╡рд░реНрдЧ" рдХрд╛ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рдкреНрд░рдХрд╛рд░ рд╕рднреА рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рд╕реЗ рд╣реЛрдХрд░ рдЧреБрдЬрд░рд╛ред

рдЗрд╕рдореЗрдВ рджреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдЬреИрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рдЖрдкрдХреЛ рдЧреИрд░-рдореМрдЬреВрдж рд╕рджрд╕реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореИрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдореЗрдВ рд╕рджрд╕реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВрдиреЗ this.newMethod() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рддреЛ рдпрд╣ рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╣реА рдЙрд▓реНрдЯреА рд╣реЛ рдЬрд╛рдПрдЧрд╛ред newMethod рдХреЛ рдХреЗрд╡рд▓ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реМрдЯрд╛рдП рдЧрдП рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореВрд▓ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреА рдХреЛрдИ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ return class extends OriginalClass { newMethod() { } } рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛)ред

рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ "рдореВрд▓ рд╡рд░реНрдЧ" рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдЧрд░ рдореИрдВ рд╕рдЬрд╛рдП рдЧрдП рд╕рджрд╕реНрдпреЛрдВ рдХреЛ this рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╡реЗ "рдореВрд▓ рд╡рд░реНрдЧ" рдХреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдпрд╣рд╛рдБ рдПрдХ рддрд░рд╣ рд╕реЗ рд╣рд╛рде рд╣рд┐рд▓рд╛ рд░рд╣рд╛ рд╣реВрдБ, рдФрд░ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдереЛрдбрд╝рд╛ рдмрд╣реБрдд рдЬрд▓ рдЧрдпрд╛ рд╣реВрдБ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдард┐рди рд╕реЛрдЪрддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдирд┐рд░рд░реНрдердХ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЙрди рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдвреВрдВрдврдХрд░ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХреЗрдВ рдЬреЛ this рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХреА рдЧрдИ рдЪреАрдЬрд╝реЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП this.something() рд▓реМрдЯрдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

@masaeedu рд╣рд╛рдБ, рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдЙрддреНрддрд░ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрдШ/рдЪреМрд░рд╛рд╣реЗ рдХреА рдмрд╛рдд рдкрд░ рдЦреБрдж рдХреЛ рд╕рд╣реА рдХрд┐рдпрд╛ред рдпрд╣ TS рдХреЗ рд▓рд┐рдП рдирдП рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐-рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд╣реИред

рдмрд╛рдХреА рд╕рдордЭ рдореЗрдВ рдЖ рдЧрдпрд╛ред рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд▓реМрдЯрд╛рдПрдВрдЧреЗ, рд╡реЗ рдЖрдо рддреМрд░ рдкрд░ рдХреЗрд╡рд▓ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрдврд╝рд╛рдПрдВрдЧреЗ рдЬреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЪреМрд░рд╛рд╣реЗ рдХреА рдЪреАрдЬ рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рдордп рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ "рдмрд╕ рдХрд╛рдо рдХрд░реЗрдЧреА"ред

рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЖрдк рдЬрд┐рд╕ рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рджреБрд░реНрд▓рдн рд╣реЛрдЧреА, рдФрд░ рдХреБрдЫ рдЙрджреНрджреЗрд╢реНрдпрдкреВрд░реНрдг рдЦрд░рд╛рдм рд╡рд┐рдХрд╛рд╕ рдирд┐рд░реНрдгрдпреЛрдВ рдХрд╛ рдирддреАрдЬрд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рддреЛ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЖрдЦрд┐рд░реА рд╕рдЬрд╛рд╡рдЯреА рдЬреЛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ рдПрдХ рд╕рднреНрдп рджреВрд╕рд░рд╛ рд╕реНрдерд╛рди рд╣реЛрдЧрд╛ (рдЗрд╕рд▓рд┐рдП рд╣рд╛рдБ, рдПрдХ рд╡рд░реНрдЧ рдПрдХ TypeError рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЬреЛ рд╕реНрд╡рдпрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛ - рдЖрджрд░реНрд╢ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрдердХ рдХреАрдордд)ред

рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЬрд┐рд╕ рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ, рд╡реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдЬрд╛рд╡рдЯреА рдХреА рдХреАрдордд рдкрд░ рд░реЛрдХрдиреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк рд▓рд╛рдкрд░рд╡рд╛рд╣ рдпрд╛ рдореВрд░реНрдЦ рд╣реИрдВ, рддреЛ TS рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред

interface C { a(); }
class C {
    foo() {
        this.a();  //<--- boom
    }
}

let c = new C();
c.foo();

рдЖрдкрдХреА рджреВрд╕рд░реА рдЖрдкрддреНрддрд┐ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ

рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╡реЗ "рдореВрд▓ рд╡рд░реНрдЧ" рдХреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ

рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИред рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдХреНрд╖рд╛ рдореЗрдВ рдХреБрдЫ рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рд╡рд╣ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХрд╛ рдирд╛рдЧрд░рд┐рдХ рд╣реЛред рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдХрд┐ рд╡рд╣рд╛рдВ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдПрдВ рдХреНрдпрд╛ рд╣реЛрдВрдЧреАред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдиреНрдп рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдХреЗрд╡рд▓ рдЗрд╕реЗ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдХрдХреНрд╖рд╛рдПрдВ рд╣рдореЗрд╢рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЯрд╛рдЗрдк рдХреА рдЬрд╛рддреА рд╣реИрдВред рддреЛ рдлреВ рдХреЗ рдЕрдВрджрд░, рдпрд╣ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдлреВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдбреЗрдХреЛрд░реЗрдЯрд░ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ (рдпрд╛рдиреА рд╕рдмрд╕реЗ рдЖрдо рд╡рд╛рд▓реЗ) рдХреЗ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд╕рдмрд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдпрд╣ "рдмрд╕" рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝рд╛, рдмрдбрд╝рд╛ рд╕реБрдзрд╛рд░ рд╣реЛрдЧрд╛ред

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдХрдХреНрд╖рд╛ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ (рдХрдХреНрд╖рд╛ рдХреЗ рдЕрдВрджрд░ this рдХреЗ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╕реЗ) рдпрджрд┐ рдФрд░ рдХреЗрд╡рд▓ рддрднреА рд╕рдЬрд╛рд╡рдЯреА рдХреБрдЫ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдореВрд▓ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдпрд╛рдиреА рдХреЗ рд▓рд┐рдП

function d(Class) {
    return class extends Class {
        blah() { }
    };
}

<strong i="9">@d</strong>
class Foo {
    a() { }
    b() { }
    c() { 
        this.blah(); // <---- valid
    }
}

рдХреНрдпрд╛ рдпрд╣ рд╕рд┐рд░реНрдл рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдмреНрд▓рд╛рд╣ рдХреЛ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХрд╛ рд╕рдорд░реНрдерди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдХреБрдЫ рднреАред рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдкрд╛рдЧрд▓ рдЪреАрдЬреЗрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдПрдХ рдкреВрд░реА рдирдИ рдХрдХреНрд╖рд╛ (рдЬреИрд╕реЗ рдЖрдкрдХрд╛ рдЕрднрд┐рд╡рд╛рджрди), рдмрд╕ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдЬрд╛рд░реА рд░рдЦреЗрдВ, рдФрд░ рд╕рдЬрд╛рд╡рдЯрдХрд░реНрддрд╛ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЙрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВред


рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рдЖрдк рдЬреЛ рднреА рдЪреБрдирддреЗ рд╣реИрдВ, рдореИрдВ рдЙрд╕рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреИрд╕реЗ рдХрд░реВрдВрдЧрд╛? рдХреНрдпрд╛ рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА

function d<T>(Class: new() => T): T & { new (): { blah(): void } } {
    return class extends Class {
        blah() { }
    };
}

рд╕рд╛рде рд╣реА рдЙрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХрдИ рднрд┐рдиреНрдирддрд╛рдПрдВ, рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдирд╣реАрдВ рдерд╛ :)

@arackaf рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕рд┐рд░реНрдл рдПрдХ рдлрдВрдХреНрд╢рди рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдк рдЗрд╕реЗ рдХрд╣реАрдВ .d.ts рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рдкреВрд░реА рдирдИ рдХрдХреНрд╖рд╛ рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реИ, рдореВрд▓ рд╡рд░реНрдЧ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкрд░ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛/рдШрдЯрд╛рдирд╛/рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдирд╛, рдпрд╛ рдореВрд▓ рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ред рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдЙрдкрд▓рдмреНрдз рд╣реИред

рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рддрд░рд╣ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ рдХреНрд▓рд╛рд╕ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ JS рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рднрд╛рд╖рд╛ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрдирд╛ рд╣реЛрдЧрд╛ред рдЖрдЬ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ this рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдФрдЪрд┐рддреНрдп рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рддреМрд░ рдкрд░, рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╣рдореЗрд╢рд╛ рд╡рд┐рд░рд╛рд╕рдд рдкрд░ рд░рдЪрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рд╣рдореЗрд╢рд╛ рдХрд░рддрд╛ рд╣реВрдВ:

function logger<T extends Constructor<Greeter>>(Class: T) {
    return class {
        readonly _impl;
        constructor() {
            this._impl = new Class()
        }
        // Use _impl ...
    };
}

рдпрд╣ рдХреБрдЫ рдкрд╛рдЧрд▓ рдЕрдХрд╛рджрдорд┐рдХ рдкреНрд░рдпреЛрдЧ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдорд┐рд╢реНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд▓рджрд▓ рдорд╛рдирдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ, рдФрд░ рдпрд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ return class extends Class рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЪреАрдЬреЗрдВ return class extends Class рдХреЗ рд╕рд╛рде рднреА рдЯреВрдЯ рдЬрд╛рдПрдВрдЧреАред

рдЖрдкрдХреЛ рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реБрдкреНрд╕ рдФрд░ рдЧрд░реНрднрдкрд╛рдд рд╕реЗ рдХреВрджрдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдЖрдкрдХреЛ рд╣рд░ рдХрджрдо рдкрд░ рд▓рдбрд╝реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЬреЛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рдмреЗрдорд╛рдиреА рд╣реИред рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЬрдм рднреА рд╡реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдЬрдЯрд┐рд▓ (рд▓реЗрдХрд┐рди рдзреНрд╡рдирд┐) рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╣рд░ рдХрд┐рд╕реА рдХреЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЗрд╕ рдирд┐рд░рд░реНрдердХ рдХреЛрдиреЗ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд▓рд╛рдмрд╛рдЬреА рд╕реЗ рдкреИрдВрддрд░реЗрдмрд╛рдЬрд╝реА рдХрд░рдиреА рд╣реЛрдЧреАред

рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╣ рдПрдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ (рдФрд░ рдореИрдВрдиреЗ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдХрдИ рдмрд╛рд░ рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рдХрд┐ рдЖрдк рдореМрдЬреВрджрд╛ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ), рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рд╕рд╣реА рдЪреАрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдХреАрдордд рдкрд░ рдЕрдкрдиреЗ рд╕реБрдЭрд╛рдП рдЧрдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╣реИред рдЖрдк рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдореЗрдВ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдорд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдЬреЛрд░ рджреЗрддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рднреА рдкрд╣реБрдВрдЪрдирд╛ рдЕрд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

@рдЕрд░рд╛рдХрдл рдпрд╣:

function d<T>(Class: new() => T): T & { new (): { blah(): void } } {
    return class extends Class {
        blah() { }
    };
}

рд╡рд┐рд╕реНрддрд╛рд░ рдЦрдВрдб рдореЗрдВ рдареАрдХ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

class C extends d(S) {
  foo() {
    this.blah(); // tsc is happy here
  }
}

рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рдеред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдШреЛрд╖рд┐рдд рд╡рд░реНрдЧ рдХреЗ рдЙрдкрд╡рд░реНрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЖрдк рдХрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

@masaeedu

рдЖрдЬ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХрд╛ рдФрдЪрд┐рддреНрдп рдирд╣реАрдВ рд╣реИред

(рд╡рд░реНрдЧ) рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдердорд┐рдХ рдЙрдкрдпреЛрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдХрдХреНрд╖рд╛ рдХреЗ рдЕрдВрджрд░ this рдХреЗ рдореВрд▓реНрдп рдХреЛ рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдмрджрд▓рдирд╛ рд╣реИред Redux рдХрд╛ @connect рдФрд░ MobX рдХрд╛ @observer рджреЛрдиреЛрдВ рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдореВрд▓ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдереВрдХрддреЗ рд╣реИрдВред рдЙрди рд╡рд┐рд╢реЗрд╖ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ this рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИ (рдХреЗрд╡рд▓ this.props рдХреА рд╕рдВрд░рдЪрдирд╛), рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╛рд░рд╣реАрди рд╣реИред

рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЖрдо рдмрд╛рдд рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдКрдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ) рдХрд┐рд╕реА рд╡рд░реНрдЧ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)ред рдмреЗрд╣рддрд░ рдпрд╛ рдмрджрддрд░ рдХреЗ рд▓рд┐рдП рд▓реЛрдЧ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдирд╛рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ

let Foo = a(b(c(
    class Foo {
    }
})));

рд╡рд┐рд░реЛрдз рдХреЗ рд░реВрдк рдореЗрдВ

<strong i="19">@a</strong>
<strong i="20">@b</strong>
<strong i="21">@c</strong>
class Foo {
}

рдЕрдм, рдХреНрдпрд╛ рдХреЛрдИ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд░рддрд╛ рд╣реИ

function d (Class){
    Class.prototype.blah = function(){
    };
}

рдпрд╛

function d(Class){
    return class extends Class {
        blah(){ }
    }
}

рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рджреВрд╕рд░рд╛, рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХрдИ рд▓реЛрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдмрддрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рднреА рдЖрд╡рд╢реНрдпрдХ рдПрдиреЛрдЯреЗрд╢рди, рдЪрд╛рд╣реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд┐рддрдирд╛ рднреА рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХреНрдпреЛрдВ рди рд╣реЛ, рдХрд┐ function c рдПрдХ рд╡рд░реНрдЧ рд▓реЗрддрд╛ рд╣реИ C рдореЗрдВ, рдФрд░ рдПрдХ рд╡рд░реНрдЧ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╕рдВрд░рдЪрдирд╛ C & {blah(): void} рд╣реИред

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рдореЗрдВ рд╕реЗ рдХрдИ рдЖрдЬ рдХреЗ рд▓рд┐рдП рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдПрдХ рдЙрдкрдпреЛрдЧреА рд╕рдмрд╕реЗрдЯ рдХреЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╡рд┐рдЪрд┐рддреНрд░ рдЪреАрдЬреЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рдЬреБрд░реНрдорд╛рдирд╛! рд▓реЗрдХрд┐рди рдЙрд╕ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

<strong i="38">@c</strong>
class Foo {
    hi(){ this.addedByC(); }
}

рдпрд╣ рд╕рд╣реА рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕реЗ c рдХреЗ рд▓рд┐рдП рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдпрд╛ рдпрджрд┐ рдореМрдЬреВрджрд╛ рдкреНрд░рдХрд╛рд░ рдПрдиреЛрдЯреЗрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП c рдкрд░ рд╕реЗрд╡рд╛ рдореЗрдВ рджрдмрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдорд╛рдорд▓рд╛ (рдФрд░ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдореВрд▓ рд╡рд░реНрдЧ рдкрд░ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рддрд╛) рдЯреАрдПрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝рд╛ рд╡рд░рджрд╛рди рд╣реЛрдЧрд╛ред

@justinfagnani рдлреА рджрд┐рд╕

function d<T>(Class: new() => T): T & { new (): { blah(): void } } {
    return class extends Class {
        blah() { }
    };
}

рдХрд╛ рдЙрддреНрдкрд╛рджрди

рдЯрд╛рдЗрдк рдХрд░реЗрдВ 'рдЯрд╛рдЗрдкреЛрдл (рдмреЗрдирд╛рдореА рд╡рд░реНрдЧ)' 'рдЯреА рдФрд░ (рдирдпрд╛ () => {рдмреНрд▓рд╛рд╣(): рд╢реВрдиреНрдп;})' рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред
рдЯрд╛рдЗрдк 'рдЯрд╛рдЗрдкреЛрдл (рдмреЗрдирд╛рдореА рд╡рд░реНрдЧ)' 'рдЯреА' рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред

рдЯреАрдПрд╕ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рдЧрд▓рдд рд╣реИрдВред

рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдШреЛрд╖рд┐рдд рд╡рд░реНрдЧ рдХреЗ рдЙрдкрд╡рд░реНрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЖрдк рдХрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдореИрдВ рдХреЗрд╡рд▓ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдореИрдВ рдЦреБрд╢реА-рдЦреБрд╢реА рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд╕реЗ JS рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ - рдореИрдВ рдмрд╕ TS рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реВрдВред рдФрд░ рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрд╡рд░реНрдЧ рд╕реЗ рд╢рд╛рджреА рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдХрднреА-рдХрднреА рд╕рдЬрд╛рд╡рдЯреА рдЧреБрдг рдпрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рд╡рд░реНрдЧ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рд▓рдХреНрд╖реНрдп рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдпрд╣ рдмрддрд╛рдирд╛ рд╣реИ рдХрд┐

<strong i="17">@c</strong>
class Foo { 
}

c рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдирдП рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ред

@arackaf рд╣рдо рдлрд┐рд░ рд╕реЗ рд╕рд┐рдВрдХ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд░рд╣реЗ рд╣реИрдВред рдмрд╣рд╕ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ:

<strong i="8">@a</strong>
<strong i="9">@b</strong>
<strong i="10">@c</strong>
class Foo {
}

рдпрд╣ рдмрдирд╛рдо:

let Foo = a(b(c(
    class Foo {
    }
})));

рдореИрдВ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдкреВрд░реНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ рдФрд░ рдЕрднреА рднреА new Foo() рдХреА рдЙрдЪрд┐рдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд░ рд╕рдХреЗрдВрдЧреЗред рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдмрд╣рд╕:

<strong i="18">@a</strong>
<strong i="19">@b</strong>
<strong i="20">@c</strong>
class Foo {
    fooMember() { 
        this.aMember(); this.bMember(); this.cMember(); 
    }
}

рдпрд╣ рдмрдирд╛рдо:

class Foo extends (<strong i="24">@a</strong> <strong i="25">@b</strong> <strong i="26">@c</strong> class { }) {
    fooMember() { 
        this.aMember(); this.bMember(); this.cMember(); 
    }
}

рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдкреВрд░реНрд╡ рдХрдИ рдорд╛рдпрдиреЛрдВ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕рдЪрд┐рддреНрд░ рдХрд┐рдпрд╛ рд╣реИред

@masaeedu рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдирд╣реАрдВ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдкреВрд░реНрд╡ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП: рдХреНрдпрд╛ рдХреЛрдИ рдПрдиреЛрдЯреЗрд╢рди рдирд╣реАрдВ рд╣реИ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣рдореЗрдВ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рд╕реЗ a , b , рдФрд░ c рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдкреВрд░реНрд╡ рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд░ рд╕рдХреЗ рдмрд╛рдж рд╡рд╛рд▓реЗ рд╕реЗ рдЕрдкреНрд░рднреЗрджреНрдп рд░реВрдк рд╕реЗ?

рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣рддреНрдпрд╛рд░рд╛ рдЙрдиреНрдирддрд┐ рд╣реЛрдЧреАред

@arackaf рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрдирд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ:

рдпрд╣ рд╕рд╣реА рд╣реИ:

type Constructor<T = object> = new (...args: any[]) => T;

interface Blah {
  blah(): void;
}

function d<T extends Constructor>(Class: T): T & Constructor<Blah> {
  return class extends Class {
    blah() { }
  };
}

class Foo extends d(Object) {
  protected num: number;

  constructor(num: number) {
    super();
    this.num = num;
    this.blah();
  }
}

рдореИрдВ рдХреЗрд╡рд▓ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдПрдХ рддрдирд╛рддрдиреА рд╣реИред рдпрд╣ рдкреНрд░рд╢реНрди рдЬреИрд╕рд╛ рд╣реИ: "рдЙрд╕ рд╣рдереМрдбрд╝реЗ рд╕реЗ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?" рдП: "рдмрд╕ рд╣рдереМрдбрд╝рд╛ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ"ред

рдХреНрдпрд╛ рдЖрдкрдХреЗ рдорди рдореЗрдВ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЗрдЪреНрдЫрд┐рдд рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдм рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрдХреНрд╖рд╛ рдХреЗ рдЕрдВрджрд░ рд╕реЗ рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред

рдореИрдВрдиреЗ Mobx рдХреЗ @observer рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рджреЗрдЦрд╛ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд░реНрдЧ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ (рдФрд░ рдХреНрд▓рд╛рд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдмрдЬрд╛рдп рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ render() рд▓рдкреЗрдЯрддрд╛ рд╣реИ)ред

@connect рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ рдареАрдХ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ @connect рд╕рдЬрд╛рдП рдЧрдП рд╡рд░реНрдЧ рдХреЗ рдЙрдк-рд╡рд░реНрдЧ рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдпрд╛ рд╡рд░реНрдЧ рдЬреЛ рд╕рдЬрд╛рдП рдЧрдП рд╡рд░реНрдЧ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ, рдлрд┐рд░ рднреА рд╕реНрдЯреИрдЯрд┐рдХреНрд╕ рдХреЛ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рдЗрдВрд╕реНрдЯреЗрдВрд╕-рд╕рд╛рдЗрдб рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╕реНрдерд┐рд░ рдкрдХреНрд╖ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ TS рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╛рдВрдЪ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @connect рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХрдиреЗрдХреНрдЯ рдХреЛ рдХреЗрд╡рд▓ рдПрдЪрдУрд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╕рдЬрд╛рд╡рдЯреА рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдмрд╣реБрдд рднреНрд░рдорд┐рдд рд╣реИред

рдореИрдВ рдЦреБрд╢реА-рдЦреБрд╢реА рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд╕реЗ JS рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

рдЕрдЪреНрдЫрд╛ ... рдЖрдкрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред JS рдореЗрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реИрдВред рдЖрдк рд╕рдВрднрд╡рддрдГ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдкрд┐рдЫрд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдмреИрдмреЗрд▓ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдиреНрдп рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдореИрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХреАрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рдЧрддрд┐ рдзреАрдореА рд╣реЛ рдЧрдИ рд╣реИ рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡реЗ рдЕрднреА рддрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВред рдХрдИ рд▓реЛрдЧреЛрдВ рдХрд╛ рддрд░реНрдХ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рд╛ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдХреЗрд╡рд▓ рдПрдиреЛрдЯреЗрд╢рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╢рдмреНрджрд╛рд░реНрде рдЕрднреА рднреА рд╣рд╡рд╛ рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╢рд┐рдХрд╛рдпрддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рд╡рд░реНрдЧ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рддрд░реНрдХ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдкрд░ рдХрдо рд╕реЗ рдХрдо рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдЧрдИ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рдерд╛ рд╕рдмрд╕реЗ рд╣рд╛рд▓рд┐рдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рд╖рд╛ рдорд┐рд▓реАред рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рддрд░реНрдХ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╡рд░реНрдЧ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдорд╛рдирдХ рдЬреЗрдПрд╕ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рдмрддрд╛рдП рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред

  • рдореИрдВ рдмрд╕ рдЯреАрдПрд╕ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реВрдВред

рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╣рд╛рдБ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХреИрд╕реЗ рдкреАрдЫреЗ рд╣реИред рдХрдо рд╕реЗ рдХрдо рдкреАрдЫреЗ рдХреНрдпрд╛? рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЬреЗрдПрд╕ рд╣реИ рдЬрд╣рд╛рдВ рдХрдХреНрд╖рд╛рдПрдВ рдЖрдкрдХреЗ рдЗрдЪреНрдЫрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреА рд╣реИрдВ?

рдбреЗрдХреЛрд░реЗрдЯрд░ рдЕрдм рд╕реНрдЯреЗрдЬ 2 рд╣реИрдВ, рдФрд░ рд▓рдЧрднрдЧ рд╣рд░ JS рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЬрд╣рд╛рдВ рддрдХ @connect рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реИ, рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░реЗрдбрдХреНрд╕ рдкреНрд░рддрд┐ рдорд╛рд╣ рд▓рдЧрднрдЧ 2.5 рдорд┐рд▓рд┐рдпрди рдбрд╛рдЙрдирд▓реЛрдб рдкрд░ рдмреИрдард╛ рд╣реИ; рдпрд╣ рд╕реБрдирдирд╛ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдЕрднрд┐рдорд╛рдиреА рд╣реИ рдХрд┐ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рд╕реА рддрд░рд╣ "рдЧрд▓рдд" рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛ред

рдбреЗрдХреЛрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХреА рдЧрдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЯрд╛рдЗрдк рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд░реНрдЬрд┐рдВрдЧ рдЬреИрд╕реЗ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝реЗ рдЧрдП рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝рдирд╛, рдпрд╛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдореНрдпреВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ (рдЬреИрд╕реЗ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рднреА рдмрддрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдо рдмрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ)ред

рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ, рд╢реНрд░рдорд╕рд╛рдзреНрдп рд░реВрдк рд╕реЗ рдЯреАрдПрд╕ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрджрд▓ рд░рд╣рд╛ рд╣реИ? рд╢рд╛рдпрдж рдпрд╣ рдкрд╛рдЧрд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЯреАрдПрд╕ рд╕рд┐рд░реНрдл рдПрдХ рдирдпрд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдирд╣реАрдВ рднреЗрдЬ рд╕рдХрд╛рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдЬрд┐рд╕рдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдЪрд▓реЛ рд╕реА: рдбреЗрдХреЛрд░реЗрдЯрд░

рдФрд░ IF (рдФрд░ рдХреЗрд╡рд▓ рдЕрдЧрд░) рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдПрдХ рд╡рд░реНрдЧ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ TS рдЙрд╕ рд╡рд░реНрдЧ рдХреЛ рдЗрдирдкреБрдЯ рдФрд░ {blah() } рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рдиреЗрдЧрд╛?

рд╡рд╕реНрддреБрддрдГ рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЕрдзрд┐рдХрд╛рдВрд╢ рдпрд╣ рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдореБрдЦрд░ рд╕рдореВрд╣ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЛ рдирд╛рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкреЛрд╕реНрдЯ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдХрд┐ рдЯреАрдПрд╕ рд╕рдВрднрд╡рддрдГ рдХреИрд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдПрдХ рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдмрджрд▓ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝рд╛ рд╡рд░рджрд╛рди рд╣реЛрдЧрд╛ред

рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП: рдХреНрдпрд╛ рдХреЛрдИ рдПрдиреЛрдЯреЗрд╢рди рдирд╣реАрдВ рд╣реИ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдП, рдмреА, рдФрд░ рд╕реА рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдкреВрд░реНрд╡ рдХреЛ рдмрд╛рдж рд╡рд╛рд▓реЗ рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд╕рдХреЗ?

рд╣рд╛рдВ, Foo рдХреЗ рд▓рд┐рдП рдЬреЛ рднреА рдЖрдХрд╛рд░ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ:

interface Foo extends <whateverextramembersiwantinfoo> { } 
<strong i="9">@a</strong>
<strong i="10">@b</strong>
<strong i="11">@c</strong>
class Foo { 
    /* have fun */
}

рдЕрднреА рдЖрдкрдХреЛ рдЬреЛ рднреА рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рдЕрдиреБрд░реВрдк рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬреНрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЙрдореНрдореАрдж рдХрд░рдиреА рд╣реЛрдЧреА, рдпрд╛ рдЖрдкрдХреЛ рдЙрди рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬрд┐рдиреНрд╣реЗрдВ рд╡реЗ рд╕реНрд╡рдпрдВ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВред рдЕрдЧрд░ рд╣рдореЗрдВ #6606 рдорд┐рд▓рддрд╛ рд╣реИ рддреЛ рдЖрдк рдмрд╕ interface Foo extends typeof(a(b(c(Foo)))) рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдбреЗрдХреЛрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХреА рдЧрдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЯрд╛рдЗрдк рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд░реНрдЬрд┐рдВрдЧ рдЬреИрд╕реЗ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝реЗ рдЧрдП рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝рдирд╛, рдпрд╛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдореНрдпреВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ (рдЬреИрд╕реЗ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рднреА рдмрддрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдо рдмрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ)ред

рдЖрдкрдиреЗ рдЙрд╕ рд╡рд░реНрдЧ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ рдЬрдм рдпрд╣ рдбреЗрдХреЛрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЬреНрдЮреЗрдпрд╡рд╛рджреА рд╣реИ, рдФрд░ рдЬрдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рддреЛ рдЗрд╕реЗ рдПрдХ рд╕рдЬрд╛рдпрд╛ рд╣реБрдЖ рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдореИрдВ рдХрдо рд╕реЗ рдХрдо рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред

рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдЙрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдПрдХ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЖрдк рдЕрднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдпрд╣ рдПрдХ рджрд░реНрдж рдмрд┐рдВрджреБ рд╣реИ?

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ - рдореИрдВрдиреЗ рдЖрдкрдХреА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХреА рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рд▓рдп рдХреЗ рд╕рд╛рде, рдареАрдХ рдЗрд╕реА рддрд░рд╣ рд╕реЗ рдореИрдВ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореЗрд░реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд░реНрдЬрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдХрд░рддрд╛ рд╣реВрдВ рдЬреИрд╕рд╛ рдЖрдкрдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдерд╛, рдЯреАрдПрд╕ рдХреЛ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирдП рд╕рджрд╕реНрдп рдЬреЛрдбрд╝реЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдЗрд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдЦреЛрджрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЙрддреНрд╕реБрдХ рд╣реИрдВред

@arackaf рд╢рд╛рдпрдж рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдХреЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд▓рдп рдХреА рдШреЛрд╖рдгрд╛ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред

рдЬрд╝рд░реВрд░ред рдореИрдВ рдПрдХ рд╡рд░реНрдЧ рдкрд░ рдПрдХ рд╕рдЬрд╛рд╡рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ рдЕрд╡рдзрд╛рд░рдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ, рдореИрдВрдиреЗ рд╕рдЬрд╛рд╡рдЯреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдХреБрдЫ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рд▓рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдореЗрд░реА рд╕рдЬрд╛рдП рдЧрдП рд╡рд░реНрдЧ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рджрд╕реНрдп рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдРрд╕рд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЕрдкрдиреЗ рд╕рдЬрд╛рд╡рдЯреА рдХреЛ рдПрдиреЛрдЯреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рдЬрд╛рдЙрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ - рднрд╡рд┐рд╖реНрдп рдХреЗ рдЯреАрдПрд╕ рд╕рдВрд╕реНрдХрд░рдг рдиреЗ рдореБрдЭреЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдиреЗ рдореБрдЭреЗ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдЦреБрд╢ рдХрд░ рджрд┐рдпрд╛ :)

рдбреЗрдХреЛрд░реЗрдЯрд░ рдЕрдм рд╕реНрдЯреЗрдЬ 2 рд╣реИрдВ, рдФрд░ рд▓рдЧрднрдЧ рд╣рд░ JS рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдФрд░ рд╡реЗ рдЕрднреА рд╕реНрдЯреЗрдЬ 2 рдкрд░ рд╣реИрдВ рдФрд░ рдмреЗрд╣рдж рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝ рд░рд╣реЗ рд╣реИрдВред рдореИрдВ рдмреБрд░реА рддрд░рд╣ рд╕реЗ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╣реЛрдВ, рдФрд░ рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЕрднреА рднреА рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдореИрдВ рдЕрдм рднреА рдРрд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЙрди рдкрд░ рдЖрдкрддреНрддрд┐ рдЬрддрд╛рддреЗ рд╣реИрдВ, рдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдПрдиреЛрдЯреЗрд╢рди рддрдХ рд╣реА рд╕реАрдорд┐рдд рд░рд╣реЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡реЗ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░реЗрдВрдЧреЗред рд╡рд░реНрддрдорд╛рди рдХрдВрдкрд╛рдЗрд▓рд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рдмрд╛рдд рдЬреЗрдПрд╕ рд╕реНрдЯреИрдВрдб рдирд╣реАрдВ рд╣реИред

рдЬрд╣рд╛рдВ рддрдХ @connect React -redux рдХреА рдмрд╛рдд рд╣реИ, рдкреНрд░рддрд┐ рдорд╛рд╣ рд▓рдЧрднрдЧ 2.5 рдорд┐рд▓рд┐рдпрди рдбрд╛рдЙрдирд▓реЛрдб рд╣реЛ рд░рд╣реЗ рд╣реИрдВ; рдпрд╣ рд╕реБрдирдирд╛ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдЕрднрд┐рдорд╛рдиреА рд╣реИ рдХрд┐ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рд╕реА рддрд░рд╣ "рдЧрд▓рдд" рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛ред

рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдЕрд╣рдВрдХрд╛рд░реА рдХрд╣рдиреЗ рдЬреИрд╕реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╣рдорд▓реЛрдВ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред

  1. рдореИрдВрдиреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЖрдк рдкрд░ рд╣рдорд▓рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭ рдкрд░ рд╣рдорд▓рд╛ рди рдХрд░реЗрдВред
  2. рдпрд╣ рдЖрдкрдХреЗ рддрд░реНрдХ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
  3. рдХрд┐рд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдХреЛ рдЙрд╕реЗ рддрдХрдиреАрдХреА рдЖрд▓реЛрдЪрдирд╛ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
  4. рдХреНрдпрд╛ рд╣рдо рдЙрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рд░реЗрдбрдХреНрд╕-рдХрдиреЗрдХреНрдЯ-рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдПрдХ рджрд┐рди рдореЗрдВ 4 рдбрд╛рдЙрдирд▓реЛрдб рд╣реЛрддреЗ рд╣реИрдВред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░реЗрдбрдХреНрд╕ рдХрд╛ connect() рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдПрдЪрдУрд╕реА рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдореИрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдерд╛ред
  5. рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реА рд░рд╛рдп рд╣реИ рдХрд┐ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЛ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЖрдХрд╛рд░ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдПрдХ рдЕрд╕рдВрдмрдВрдзрд┐рдд рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХрд╛рдлреА рдЙрдЪрд┐рдд рд╣реИ, рдФрд░ рдЬреЗрдПрд╕ рд╕рдореБрджрд╛рдп рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордЭреМрддрд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЕрднрд┐рдорд╛рдиреА рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ, рднрд▓реЗ рд╣реА рдЖрдк рдЕрд╕рд╣рдордд рд╣реЛрдВред

рдбреЗрдХреЛрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХреА рдЧрдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЯрд╛рдЗрдк рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд░реНрдЬрд┐рдВрдЧ рдЬреИрд╕реЗ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝реЗ рдЧрдП рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝рдирд╛, рдпрд╛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдореНрдпреВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ (рдЬреИрд╕реЗ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рднреА рдмрддрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдо рдмрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ)ред

рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рд╕рд┐рд░реНрдл рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ @masaeedu рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рдЯрд╛рдЗрдк-рд╕реЗрдл рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореМрдЬреВрджрд╛ рддрдВрддреНрд░ рд╣реИрдВ: рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдФрд░ рдорд┐рдХреНрд╕рд┐рди рдПрдкреНрд▓рд┐рдХреЗрд╢рдиред рдореИрдВ рдпрд╣ рдкреВрдЫрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЖрдкрдХрд╛ d рдЙрджрд╛рд╣рд░рдг рдорд┐рдХреНрд╕рд┐рди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдХреНрдпреЛрдВ рдирд╣реАрдВ рдерд╛, рдФрд░ рдЖрдкрдиреЗ рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджрд┐рдпрд╛ рдХрд┐ рдЖрдк рд╕рд┐рд░реНрдл рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рддрдЪреАрдд рдХреЛ рдХрд╛рдлреА рдЧрдВрднреАрд░ рд░реВрдк рд╕реЗ рд╕реАрдорд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдлрд┐рд░ рд╕реЗ рдЭреБрдХреВрдВрдЧрд╛ред

@justinfagnani рдореИрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛

import {connect} from 'react-redux'

connect рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рд╡рд░реНрдЧ (рдШрдЯрдХ) рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЕрд▓рдЧ рдереВрдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдКрдкрд░ рдХрд╣рд╛ рдерд╛ред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдмреИрдмреЗрд▓ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреЛрдиреЛрдВ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ connect рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ

class UnConnectedComponent extends Component {
}

let Component = connect(state => state.foo)(UnConnectedComponent);

рдпрд╛ рдЗрд╕ рддрд░рд╣

@connect(state => state.foo)
class Component extends Component {
}

рдореИрдВ рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдпрд╛ рдХреЛрдИ рдФрд░ рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдХреЛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдРрд╕рд╛ рд╣реА рд╣реЛ; рдХрдИ рд╕рдбрд╝рдХреЗрдВ рд░реЛрдо рдХреА рдУрд░ рдЬрд╛рддреА рд╣реИрдВред рдореИрдВ рдЗрд╕реА рддрд░рд╣ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдБ

<strong i="19">@mappable</strong>
<strong i="20">@vallidated</strong>
class Foo {
}

рдКрдкрд░

let Foo = validated(mappable(class Foo {
}));

рдпрд╛

class Foo extends mixin(validated(mappable)) {
}
//or however that would look.

рдореИрдВрдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдирд╣реАрдВ рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдореИрдВ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рд╕реНрдкрд╖реНрдЯ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рдКрдВрдЧрд╛: рдореИрдВ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдФрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рдкреВрд░рд╛, рдкреВрд░рд╛ рдзрд╛рдЧрд╛ рдЯреАрдПрд╕ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдХреБрдЫ рдХреНрд╖рдорддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд╕рдЬрд╛рд╡рдЯреА рд╡рд░реНрдЧ рдХреЛ рдкреНрд░рд╢реНрди рдореЗрдВ рдХреИрд╕реЗ рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рд▓рдп рдЬреИрд╕реЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдУрдкреА рдиреЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдЬрдм, рд╣рдо рдмрд╕ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

declare function Blah<T>(target: T): T & {foo: number}

<strong i="31">@Blah</strong>
class Foo {
    bar() {
        return this.foo; // Property 'foo' does not exist on type 'Foo'
    }
}

new Foo().foo; // Property 'foo' does not exist on type 'Foo'

рд╕рд┐рд░реНрдл рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдореМрдЬреВрдж рд╣реИрдВ, рджреЛрдиреЛрдВ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рд╛рд░рд╣реАрди рд╣реИрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬреЗрдПрд╕/рдЯреАрдПрд╕ рд╕рдореБрджрд╛рдп рдореЗрдВ рдХрдИ рд▓реЛрдЧ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЛ рдирд╛рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рд╛рд░рд╣реАрди рд╣реИред

рдЕрдЧрд░ рдЯреАрдПрд╕ рд╣рдореЗрдВ рдЗрд╕ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╣реИ, рддреЛ рдпрд╣ рднрд╛рд╖рд╛ рдФрд░ рд╕рдореБрджрд╛рдп рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝рд╛ рд▓рд╛рдн рд╣реЛрдЧрд╛ред

@arackaf рдЖрдкрдиреЗ рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХреА рдХрд┐ рдХреИрд╕реЗ connect рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ $# this рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рджрд╕реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред AFAICT, рдЖрдкрдХрд╛ рдШрдЯрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдЬреНрдЮреЗрдпрд╡рд╛рджреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ connect рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ props рдФрд░ state рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рддреЛ рдЙрд╕ рдЕрд░реНрде рдореЗрдВ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ connect рдХреЛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ @justinfagnani рдХреЗ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЕрдзрд┐рдХ рд╕рд╣рдордд рд╣реИред

рдЬрд╝рд░реВрд░реА рдирд╣реАрдВред рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛

@connect(state => state.stuffThatSatisfiesPropsShape)
class Foo extends Component<PropsShape, any> {
}

рдлрд┐рд░ рдмрд╛рдж рдореЗрдВ

<Foo />

рдпрд╣ рдорд╛рдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдкреНрд░реЙрдкреНрд╕рд╢реИрдк рдкреНрд░реЙрдкреНрд╕ Redux рд╕реНрдЯреЛрд░ рд╕реЗ рдЖ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлреВ рдХреА рдореВрд▓ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рджреВрд░ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рд╛рдкрддрд╛ рдкреНрд░реЙрдкреНрд╕ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓ рд░рд╣реА рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ any рдХреЗ рд░реВрдк рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореВрд▓ рд░реВрдк рд╕реЗ рдУрдкреА рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рд╕рдЯреАрдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛, рдФрд░ рдпрд╣рд╛рдВ рдКрдкрд░ рдореЗрд░реА рджреВрд╕рд░реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдХреЛрдб рдмреЗрд╕ рдореЗрдВ рдмреЗрд╣рдж рдЖрдо рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рджрд┐рдЦрдиреЗ рд╕реЗ, рдХрдИ рдЕрдиреНрдп рднреАред рд╣рдо рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдЪреАрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

<strong i="6">@validated</strong>
<strong i="7">@mappable</strong>
class Foo {
}

рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рд▓рдп рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдкрд╛рд░рджрд░реНрд╢реА рд░реВрдк рд╕реЗ рд╡рд┐рд▓рдп рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЕрджреНрднреБрдд рд╣реЛрдЧрд╛ред

рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдордВрдбрд▓рд┐рдпреЛрдВ рдореЗрдВ рдЬрд╛рддреЗ рд░рд╣рддреЗ рд╣реИрдВред рд╣рдо рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ Foo рдХрд╛ рдкреНрд░рдХрд╛рд░ connect рдХрд╛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдЗрд╕ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рд╣реИрдВред

рдЬрд╣рд╛рдВ рд╣рдо рднрд┐рдиреНрди рд╣реИрдВ, рдХреНрдпрд╛ Foo рдХреЗ рдЕрдВрджрд░ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдпрд╣ рджрд┐рдЦрд╛рд╡рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ this рдбреЗрдХреЛрд░реЗрдЯрд░ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдФрд░ "рдореВрд▓ рдлреВ" рдХрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╕рдорд╛рдореЗрд▓рди рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИред рдЖрдкрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред

рдЬрд╣рд╛рдВ рд╣рдо рднрд┐рдиреНрди рд╣реИрдВ, рдХреНрдпрд╛ рдлреВ рдХреЗ рдЕрдВрджрд░ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдпрд╣ рджрд┐рдЦрд╛рд╡рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдбреЗрдХреЛрд░реЗрдЯрд░ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдФрд░ "рдореВрд▓ рдлреВ" рдХрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╕рдорд╛рдореЗрд▓рди рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИред рдЖрдкрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИред рдКрдкрд░ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ, рдФрд░ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдУрдкреА рдХрд╛ рдореВрд▓ рдХреЛрдбред рдпрд╣ рдПрдХ рдЕрддреНрдпрдВрдд рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИред

рдХреГрдкрдпрд╛ рдореБрдЭреЗ рджрд┐рдЦрд╛рдПрдВ рдХрд┐ connect рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рдХреНрдпрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрд╕реЗ рдШрдЯрдХ рдХреЗ рдЕрдВрджрд░ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЙрддреНрддрд░ "рдХреБрдЫ рдирд╣реАрдВ" рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ connect рдлрд┐рд░ рд╕реЗ рди рд▓рд╛рдПрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред

@masaeedu рдХрд╛рдлреА рдореЗрд▓рд╛, рдФрд░ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВред рдореИрдВ рдЬреНрдпрд╛рджрд╛рддрд░ @justinfagnani рдХреЗ рджрд╛рд╡реЗ рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреИрд╕реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЛ рдореВрд▓ рд╡рд░реНрдЧ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, connect рдХреЛ рдЦрд░рд╛рдм рддрд░реАрдХреЗ рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЖрджрд┐ рдЖрджрд┐ред

рдореИрдВ рдХреЗрд╡рд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ I рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдореМрдЬреВрдж рд╣реИрдВред

рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рд╣рд╛рдБ, рдореБрдЭреЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдПрдирдкреАрдПрдо рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХрдХреНрд╖рд╛ рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ рдирдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдирдИ рдХрдХреНрд╖рд╛ рдХреЛ рд╡рд╛рдкрд╕ рдереВрдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдЬрд╛рдП рдЧрдП рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬреЛ рдореИрдВ рдФрд░ рдЕрдиреНрдп рдЕрдХреНрд╕рд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдорд┐рд╢реНрд░рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдирдкреАрдПрдо рдкрд░ рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИред

рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рд╡рд╛рдж рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рд╣реИ рдирд╛?

@arackaf рдирд╣реАрдВ, рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк this рдкрд░ рдХрд┐рд╕реА рднреА рд╕рджрд╕реНрдп рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ @connect рджреНрд╡рд╛рд░рд╛ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рд╕рдЯреАрдХ рд╕реНрдирд┐рдкреЗрдЯ:

@connect(state => state.stuffThatSatisfiesPropsShape)
class Foo extends Component<PropsShape, any> {
    render(){
        this.props.stuffFromPropsShape // <----- added by decorator
    }
}

рдЖрдЬ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдВрдХрд▓рди рдХрд░реЗрдЧрд╛ред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЪрд┐рдкрдХрд╛рдП рдЧрдП рд╕реНрдирд┐рдкреЗрдЯ рдХрд╛ рдЙрд╕ рд╕реБрд╡рд┐рдзрд╛ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЖрдк рдЕрдиреБрд░реЛрдз рдХрд░ рд░рд╣реЗ рд╣реИрдВред

@masaeedu - рдХреНрд╖рдорд╛ рдХрд░реЗрдВ - рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореИрдВ рдЧрд▓рдд рдерд╛ рдФрд░ рдЙрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдирд╛ рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рддреЗрдЬрд╝ рдирд╣реАрдВ рд╣реИ :(

@arackaf рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рд╣реИ, рдФрд░ рдореИрдВрдиреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рди рддреЛ рд╕реНрд╡рдпрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рди рд╣реА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдПрдВрдЧреБрд▓рд░ 2 рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЬреАрд╡рди рдореЗрдВ рдХрднреА рднреА рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдорд╛рдВрдЧ рд░рд╣рд╛ рдерд╛ рдЬрд╣рд╛рдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдореЗрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рд╕рджрд╕реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ рдПрдХ рджрд░реНрдж рдмрд┐рдВрджреБ рд╣реИред

рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд╣рд╛рдВ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдп this рд╕реЗ рдХреБрдЫ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдХрдХреНрд╖рд╛ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдпрд╛ рдХрдХреНрд╖рд╛ рдХреЗ extends рдЦрдВрдб рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реЛред рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рднреА рдЗрд╕рдиреЗ рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╣реИ рдЬреЛ рдХреБрдЫ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╡рд░реНрдЧ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХрдХреНрд╖рд╛ рдХреЛ рдЬреЛ рдХреБрдЫ рднреА рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЙрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рджреВрд╕рд░реА рддрд░рдлред рдпрд╣ рд╕рд┐рд░реНрдл рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди рдХреНрдпреЛрдВ рд╣реИред рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдорд╛рд░реЗ рдХреЛрдб рдмреЗрд╕ рд╕реЗ рдХреЛрдб рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╣реИ рдЬреЛ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдмрд╛рд╣рд░ред рдЙрд╕ рд╕рдордп рдореИрдВрдиреЗ рдЗрд╕ рдШреЛрд╖рдгрд╛ рдХреЛ рд╡рд╣реАрдВ рдкрд░ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдерд╛ред рдореИрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред

рд▓реЗрдХрд┐рди рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреБрдЫ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рди рдХрд░реЗрдВред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ "рдпрд╣ рдбреЗрдХреЛрд░реЗрдЯрд░ рдпрд╣рд╛рдВ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ - рдХрдХреНрд╖рд╛ рдХреЗ рдЕрдВрджрд░ this рдХреЛ рднреА рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ"

рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

image

@arackaf рд╣рд╛рдБ, рддреЛ рдЖрдкрдХреЛ export class SearchVm extends (@mappable({...}) class extends SearchVmBase {}) рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ SearchVm рд╣реИ рдЬреЛ рдореИрдкреЗрдмрд┐рд▓рд┐рдЯреА рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рджреВрд╕рд░реА рддрд░рдлред

рдирд┐рд░реНрдпрд╛рдд рд╡рд░реНрдЧ SearchVm рдмрдврд╝рд╛рддрд╛ рд╣реИ (@mappable({...}) рд╡рд░реНрдЧ SearchVmBase {} рдмрдврд╝рд╛рддрд╛ рд╣реИ)

рдЗрд╕ рдзрд╛рдЧреЗ рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ рдЗрд╕ рддрд░рд╣ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╕реЗ рдмрдЪрдирд╛ рд╣реИред рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ, рдЕрдзрд┐рдХ рдЕрдЪреНрдЫреЗ рдбреАрдПрдХреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░рдг рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИред

рдпрджрд┐ рдЖрдк рдЗрд╕ рдзрд╛рдЧреЗ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдЖрд╢реНрд╡рд╕реНрдд рд╣реЛрдВрдЧреЗ рдХрд┐ рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧ рд╕рд░рд▓ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рд╣рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ "рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди" рдХреНрдпрд╛ рд╣реИред

рдЖрдк рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕рдХрд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рддрдВрддреНрд░ "рд╣реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рд╛рдорд╛рди рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдмрддрд╛ рджреВрдВ", рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмрд╣реБрдд рд╕реАрдорд┐рдд рд╣реИред рдЕрднреА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд░реНрдЬрд┐рдВрдЧ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд░реНрдЬрд┐рдВрдЧ рдХреЛ рдЙрдирдХреЗ рддрд░реНрдХреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВ, рдЬреЛ рдХрд┐ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред

рдЕрднреА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд░реНрдЬрд┐рдВрдЧ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд░реНрдЬрд┐рдВрдЧ рдХреЛ рдЙрдирдХреЗ рддрд░реНрдХреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВ, рдЬреЛ рдХрд┐ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред

рдареАрдХред рдХрд╛рдлреА рдЙрдЪрд┐рддред рдХреНрдпрд╛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдЦреЛрд▓реВрдВ, рдпрд╛ рдЖрдк рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЖрджрд┐?

@arackaf рдПрдХрдорд╛рддреНрд░ "рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ" рдпрд╣ рддрдереНрдп рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ class { } рдерд╛, рдЬреЛ рдХрд┐ a) рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд 7 рд╡рд░реНрдг рд╣реИрдВ, рдЪрд╛рд╣реЗ рдЖрдк рдХрд┐рддрдиреЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ b) рдЗрд╕ рддрдереНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ рдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ (рдЕрднреА рддрдХ ) рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╡рд░реНрдЧ-рд╡рд╛рдкрд╕реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛ, рдФрд░ рд╕реА) рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рд▓рд╛рдн рдХреЗ рд▓рд┐рдП рд╕рдЬрд╛рд╡рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдпрд╣ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реВрддреНрд░реАрдХрд░рдг:

export class SearchVm extends mappable({...})(SearchVmBase)
{
}

рдореВрд▓ рд░реВрдк рд╕реЗ рдЖрдк рдЬреЛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдирд╣реАрдВ рд╣реИред

рдареАрдХред рдХрд╛рдлреА рдЙрдЪрд┐рддред рдХреНрдпрд╛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдЦреЛрд▓реВрдВ, рдпрд╛ рдЖрдк рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЖрджрд┐?

рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдЕрдЪреНрдЫрд╛ рд░рд╣реЗрдЧрд╛ред

рдЖрдк рдореВрд▓ рд░реВрдк рд╕реЗ рдЬреЛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдирд╣реАрдВ рд╣реИ

рдпрд╣ рдЕрдм рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╢рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЗрд╕ рддрдереНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЙрд╕ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдирд╛рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рдмреЗрд╣рддрд░ рдпрд╛ рдмрджрддрд░ рдХреЗ рд▓рд┐рдП, рдХрдИ рдбреАрдПрдХреНрд╕ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреА рдкреЗрд╢рдХрд╢ рдХреЛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред

рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдЕрдЪреНрдЫрд╛ рд░рд╣реЗрдЧрд╛ред

рдореИрдВ рдХрд▓ рдПрдХ рдЯрд╛рдЗрдк рдХрд░реВрдВрдЧрд╛, рдФрд░ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реВрдВрдЧрд╛ред

рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж :)

рдЕрдЧрд░ рдореИрдВ рдЕрдВрджрд░ рдЬрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, @masaeedu рдореИрдВ рдЗрд╕ рдХрдерди рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВ:

рдЖрдк рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕рдХрд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рддрдВрддреНрд░ "рд╣реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рд╛рдорд╛рди рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдмрддрд╛ рджреВрдВ", рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмрд╣реБрдд рд╕реАрдорд┐рдд рд╣реИред рдЕрднреА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд░реНрдЬрд┐рдВрдЧ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд░реНрдЬрд┐рдВрдЧ рдХреЛ рдЙрдирдХреЗ рддрд░реНрдХреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВ, рдЬреЛ рдХрд┐ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреНрд▓рд╛рд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╡рд░реНрдЧ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред "рддрд░реНрдХреЛрдВ рдореЗрдВ рд╡рд┐рд▓рдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рдиреЗ" рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рддреЛ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирдирд╛ рдХрд┐ рдПрдХ рдХрдиреЗрдХреНрдЯреЗрдб рдШрдЯрдХ рдХреЛ рдЕрдм рдкреНрд░реЙрдкреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдПрдХ рдкрд╣рд▓реВ рд╣реИ рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рд░рд┐рдПрдХреНрдЯ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде Redux рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИред

@codeandcats рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? https://github.com/Zalastax/openschedule/blob/335ee3834122da7f65ba35f89d8fd737309fc4fb/src/components/week-selection/index.tsx _ .tsx

@codeandcats рдЬрдм рд╕реЗ рдзрд╛рдЧрд╛ рд╢реБрд░реВ рд╣реБрдЖ рд╣реИ, рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдордВрдбрд▓рд┐рдпреЛрдВ рдореЗрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдЕрдм рдФрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдХреГрдкрдпрд╛ рдкрд┐рдЫрд▓реА рдЪрд░реНрдЪрд╛ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦреЗрдВ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдореИрдВ @arackaf рд╕реЗ рдХрд┐рд╕ рдмрд╛рдд рд╕реЗ рдЕрд╕рд╣рдордд рдерд╛ред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЬрдм рдЖрдк <strong i="8">@bar</strong> class Foo { } рдХрд░рддреЗ рд╣реИрдВ, рддреЛ Foo рдХрд╛ рдкреНрд░рдХрд╛рд░ bar рдХрд╛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ this рдХреЗ рдЕрдВрджрд░ Foo рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред connect рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рд╡рд┐рд╡рд╛рдж рдХреЗ рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ connect рд╕рдЬрд╛рдП рдЧрдП рдШрдЯрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдЧрд░реВрдХ рд╣реЛрдиреЗ рдФрд░ рдЙрди рд╕рджрд╕реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВред

рдореИрдВ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдирд┐рд░рд╛рд╢ рд╣реИрдВ @masaeedu рд▓реЗрдХрд┐рди рдпрд╣ рдордд рдорд╛рдирд┐рдП рдХрд┐ рдореИрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЗрд╕ рдкрд░ рдЕрдкрдиреА рд░рд╛рдп рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЖрдк рдкрд┐рдЫрд▓реЗ 48 рдШрдВрдЯреЛрдВ рд╕реЗ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рдЪрд░реНрдЪрд╛ рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ - рддреЛ рдХреГрдкрдпрд╛ рдХреГрдкрд╛рд▓реБ рд╕рд╛рдереА рдореБрдЭреЗ рдмрдЦреНрд╢ рджреЛред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рдЬрд╛рдП рдЧрдП рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░ рдЗрд╕реЗ рд╕рдЬрд╛рд╡рдЯреА рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рд╣рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдЗрд╕рд╕реЗ рдЕрд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ @arackaf рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░ рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд┐рдВрджреБ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╣реИред

рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рд╕рддреНрдп рдХреЗ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдореБрджреНрджрд╛ рд╣реИ, рди рдХрд┐ рдХреБрдЫ рдирдП рд╡рд┐рдЪрд┐рддреНрд░ рддрд░реНрдХ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рд╕рд┐рд░реНрдл рдПрдХ рд╕реНрдЯреНрд░реЙ-рдореИрди рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

@Zalastax рдЬреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдШреЛрдВрд╕рд▓рд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдЕрдм рд╡рд░реНрдмреЛрдЬрд╝ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕реБрдЦрдж рдирд╣реАрдВ рд╣реИ - рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдореЗрд░рд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?

рдХреГрдкрд╛рд▓реБрддрд╛ рдЖрджрд┐

рд╢реЛрд░ред

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ @arackaf рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░ рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд┐рдВрджреБ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╣реИред

рдпрд╣ рдЙрд╕ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХрд╛ рдХреЗрдВрджреНрд░реАрдп рдмрд┐рдВрджреБ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЖрдк рдЬрд╡рд╛рдм рджреЗ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред @arackaf рдХреНрдпрд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдореЛрдЯреЗ рддреМрд░ рдкрд░, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдкрд░ рд╡рд┐рд▓рдп рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рджреНрд╡рд╛рд░рд╛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдореИрдВ рдЬреЛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЙрд╕рдХреЗ рд╕рдорд╛рди рд╣реИ) рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рд╣реИ рдЬрд╣рд╛рдВ <strong i="12">@foo</strong> class Foo { } рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк Foo рдХреЗ рд▓рд┐рдП const Foo = foo(class { }) рдХреЗ рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рдЬрд╛рдП рдЧрдП рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░ рдЗрд╕реЗ рд╕рдЬрд╛рд╡рдЯреА рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рд╣рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдЗрд╕рд╕реЗ рдЕрд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВ

рдпрджрд┐ рдЖрдкрдиреЗ рдХрд┐рд╕реА рдРрд╕реА рдмрд╛рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╣рдо рд╕рд╣рдордд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ "рдореИрдВ рдЗрд╕ рдХрдерди рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВ" рдХреЗ рд╕рд╛рде рдкреЗрд╢ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдЖрдк рдмрд╕ рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдХреНрдпрд╛ рдореБрдЭреЗ рдЗрд╕ рдирдордХ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдлреНрд░рд╛рдИ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ?

рдУрд╣, рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдЬрдм рдЖрдк рдЕрдкрдиреЗ рд╕рд╛рдерд┐рдпреЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рдг рджреЗрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдареАрдХ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд▓реЛрдЧ рдЖрдкрдХреЛ рдЗрд╕ рдкрд░ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╢реЛрд░ рд╣реИред

рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ @arackaf рдиреЗ рдЬреЛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЙрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреА "рддрд░реНрдХ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди" рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред

рднрд▓реЗ рд╣реА рд╣рдо @arackaf рд╕реЗ рд╕рд╣рдордд рд╣реЛрдВ рдпрд╛ рдирд╣реАрдВ, рдореЗрд░реА рд╡рд┐рдирдореНрд░ рд░рд╛рдп рдореЗрдВ, рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗрд╡рд▓ рдбреЗрдХреЛрд░реЗрдЯрд░ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдЖрдк рдХреЗ рд▓рд┐рдП рдХреГрдкрд╛рд▓реБ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛; рдЗрд░рд╛рджрд╛ рдЖрдкрдХреЛ рдкрд╛рдиреЗ рдХрд╛ рдерд╛
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдЬреБрдЭрд╛рд░реВ рдзрд╛рдЧрд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХреЛ рднреА рдорд╛рдл рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рд╕реНрдХрд┐рдорд┐рдВрдЧ рдореИрдВ рдЗрд╕ рдкрд░ рдХрд╛рдпрдо рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрднреА рднреА рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЖрдк рдЬрд╛рдЧрд░реВрдХ рдирд╣реАрдВ рд╣реИрдВ
рд╡рд┐рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдореЗрд░реЗ рд╕рд╛рде "рдЕрд╕рд╣рдордд" рдХреА рдЧрд▓рддрдлрд╣рдореА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реИрдВ
рдореЗрд░рд╛ рд╕реНрдерд╛рдиред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХрд╛ рдкреНрд░рд╢реНрди рдХреНрдпреЛрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рд▓рдп рдХрд░ рд░рд╣рд╛ рд╣реИ
рддрд░реНрдХ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ рдПрдбрдо рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЙрддреНрддрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХреЛ рджреЗрдЦрдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рдПрдбрдо рдХреЗ рд╕рд╛рде рдЪрд░реНрдЪрд╛, рдЬрд╣рд╛рдВ рд╡рд╣ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдВрдЯрд░рдлреЗрд╕ рд╡рд┐рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ,
рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рдШреЛрд╖рдгрд╛ рд╕реНрдерд▓ рдкрд░ рдРрд╕рд╛ рдХрд░рдирд╛ рдХрд╖реНрдЯрдкреНрд░рдж рд▓рдЧрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд╕рднреА рддрдХрдиреАрдХреА рдкрд╣рд▓реБрдУрдВ рдХреЛ рдкреАрдЯ-рдкреАрдЯ рдХрд░ рдорд╛рд░ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВ
рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдзрд╛рдЧреЗ рдкрд░ рдЖрдкрд╕реА рдЭрдЧрдбрд╝реЛрдВ рдХрд╛ рдмреЛрд▓рдмрд╛рд▓рд╛ рд╣реЛ, рдЗрд╕рд▓рд┐рдП рдпрд╣
рдореЗрд░реА рдЖрдЦрд┐рд░реА рдкреЛрд╕реНрдЯ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣реА рд╣реИред

рдпрд╣ рд╕рдЪ рд╣реИ, рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рджреЛ рдмрдЧ рд╣реИрдВ: рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдореНрдорд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ, рдЬреЛрдбрд╝реЗ рдЧрдП рд╕рджрд╕реНрдпреЛрдВ рдХрд╛ рд╕рдореНрдорд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ( this рдХрдХреНрд╖рд╛ рдХреЗ рдЕрдВрджрд░)ред рдФрд░ рд╣рд╛рдВ, рдореИрдВ рдмрд╛рдж рд╡рд╛рд▓реЗ рд╕реЗ рдЕрдзрд┐рдХ рдЪрд┐рдВрддрд┐рдд рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкреВрд░реНрд╡ рдХреЛ рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдПрдХ рдЕрд▓рдЧ рдорд╛рдорд▓рд╛ рдЦреЛрд▓рд╛ рд╣реИ: https://github.com/Microsoft/TypeScript/issues/16599

рд╣реЗ рд╕рдм рд▓реЛрдЧ, рдореИрдВ рдЗрд╕ рдмрд╛рддрдЪреАрдд рдХреЛ рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдореЗрдВ рдЪреВрдХ рдЧрдпрд╛, рдФрд░ рд╢рд╛рдпрдж рдЕрдм рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд▓рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ; рд▓реЗрдХрд┐рди рдореИрдВ рд╕рднреА рдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдЪрд░реНрдЪрд╛рдУрдВ рдХреА рдЧрд░реНрдореА рдореЗрдВ, рдЖрдо рддреМрд░ рдкрд░ рд╡рдЬрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣рд░ рд╡реНрдпрдХреНрддрд┐ рдиреЗрдХ рдЗрд░рд╛рджреЗ рд╡рд╛рд▓рд╛ рд╣реЛрддрд╛ рд╣реИред рдПрдХ рд╕рдореНрдорд╛рдирдЬрдирдХ рд╕реНрд╡рд░ рд░рдЦрдиреЗ рд╕реЗ рдмрд╛рддрдЪреАрдд рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИ, рдФрд░ рдирдП рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ (рдЦрд╛рд╕рдХрд░ рдЬрдм рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд╛рдардХ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдореИрдВ

рдЗрд╕ рдкрд░ рдХреНрдпрд╛ рд╕реНрдерд┐рддрд┐ рд╣реИ?

@ alex94puchades рдпрд╣ рдЕрднреА рднреА рдПрдХ рдЪрд░рдг 2 рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╢рд╛рдпрдж рдЕрднреА рднреА рдХреБрдЫ рд╕рдордп рдорд┐рд▓ рдЧрдпрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ TC39 рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рдкрд░ рдХреБрдЫ рд╣рд▓рдЪрд▓ рд╣реИ ред

рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЪрд░рдг 3 рдХреЗ рд▓рд┐рдП рдирд╡рдВрдмрд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдбреЗрдХреЛрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХрд╛

рдПрдХ рдЦрд╛рд▓реА рд╡реИрдкрд░ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝реЗрдВ

export default function wapper (cb: any) {
    return cb;
}

рдкрд░рд┐рднрд╛рд╖рд╛ рдЬреЛрдбрд╝реЗрдВ

export function wapper(cb: IterableIterator<0>): Promise<any>;

рдирддреАрдЬрд╛

<strong i="13">@some</strong> decorator // run generator and return promise
function *abc() {}

wapper(abc()).then() // valid

/рдЧреБрдирдЧреБрдирд╛рд╣рдЯ

рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕рдХрд╛ рд╣рд▓ рдвреВрдВрдв рд░рд╣рд╛ рд╣реИ, рддреЛ рдореИрдВ рдиреАрдЪреЗ рдЖрдпрд╛ рдПрдХ рдХрд╛рдордХрд╛рдЬ рд╣реИред

рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдЧреБрдг рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣реЛрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ рдХреНрд▓рд╛рд╕ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдкрд░ рдлреНрд▓реИрдЯред

рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдореИрдВ рдЕрдкрдиреЗ рдХреЛрдгреАрдп 5 рдореЛрдбрд▓ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдорд╛рди рд▓реАрдЬрд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ @ModalParams(...) рдбреЗрдХреЛрд░реЗрдЯрд░ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдХрд╕реНрдЯрдо ConfirmModalComponent рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдореЗрд░реЗ рдХрд╕реНрдЯрдо рдШрдЯрдХ рдХреЗ рднреАрддрд░ @ModalParams(...) рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдПрдХ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИ рдЬреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЗрд╕рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

export class Modal {
    params: any;

    constructor(values: Object = {}) {
        Object.assign(this, values);
    }
}

export function ModalParams (params?: any) {
    return (target: any): void  => {
        Object.assign(target.prototype, {
            params: params
        });
    };
}

@Component({...})
@ModalOptions({...})
@ModalParams({
    width:             <number> 300,
    title:             <string> 'Confirm',
    message:           <string> 'Are you sure?',
    confirmButtonText: <string> 'Yes',
    cancelButtonText:  <string> 'No',
    onConfirm:         <(modal: ConfirmModalComponent) => void> (() => {}),
    onCancel:          <(modal: ConfirmModalComponent) => void> (() => {})
})
export class ConfirmModalComponent extends Modal {
    constructor() {
        super();
    }

    confirm() {
        this.params.onConfirm(this); // This does not show a syntax error 
    }

    cancel() {
        this.params.onCancel(this); // This does not show a syntax error 
    }
}

рджреЛрдмрд╛рд░рд╛, рдпрд╣ рдмрд╣реБрдд рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдХреЛрдИ рдФрд░ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧреА рдкрд╛ рд╕рдХрддрд╛ рд╣реИред

@lansana рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ?

@confraria рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдПрдХ рд╕рд╛рдорд╛рдиреНрдп Modal рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХреБрдЫ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛):

export class Modal<T> {
    params: T;
}

export function ModalParams (params?: any) {
    return (target: any): void  => {
        Object.assign(target.prototype, {
            params: params
        });
    };
}

// The object in @ModalParams() should be of type MyType
@ModalParams({...})
export class ConfirmModalComponent extends Modal<MyType> {
    constructor() {
        super();
    }
}

: / рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдкреНрд░рдХрд╛рд░ рд╕рдЬрд╛рд╡рдЯреА рд╕реЗ рдЕрд▓рдЧ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдирдореЗрдВ рд╕реЗ рджреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ..:( рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрджрд┐ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рддреЛ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓реЗрдВрдЧреА .. :( рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡рд╣рд╛рдВ рдЗрд╕ рд╕рдордп рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ

рд╣рд╛рдБ, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реЛ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЗрддрдирд╛ рдмреЗрд╣рддрд░ рдФрд░ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдмрдирд╛рддрд╛ рд╣реИред рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЬрд▓реНрдж рд╣реА рдЗрд╕рдореЗрдВ рд╕реЗ рдХреБрдЫ рдирд┐рдХрд▓реЗрдЧрд╛ред

@lansana рд╣рд╛рдБ, рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рд╕ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡реЗ рдХреНрд▓рд╛рд╕ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдЕрдкрдиреЗ рджрдо рдкрд░ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВ, рдмрд┐рдирд╛ рдХреНрд▓рд╛рд╕ рдХреЛ рдХреБрдЫ рдФрд░ рдмрдврд╝рд╛рдиреЗ рдпрд╛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд░рдпрд╛рд╕ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рджреЛрд╣рд░рд╛рд╡ рд╣реИ) .

рд╕рд╛рдЗрдб рдиреЛрдЯ: рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ params рд╕рдЬрд╛рдП рдЧрдП рдореЛрдбрд▓ рдШрдЯрдХ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реНрдерд┐рд░ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрджрд░реНрдн рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╢рд╛рдпрдж рдпрд╣ рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣реИред : - ) рд▓реЗрдХрд┐рди рдореИрдВ рдкреАрдЫреЗ рд╣рдЯрд╛...

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ, рдореИрдВ рдХрдХреНрд╖рд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдкрдХреНрд╖ рдХреЛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред рдпрджрд┐ рд╡рд░реНрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЭрдкрдЯреНрдЯрд╛ рдорд╛рд░рдиреЗ рдФрд░ рдЙрди рд╕рднреА рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рддреЛ рдпрд╣ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкрд░ рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд╕рдд рдЪрд╛рд▓ рд╣реЛрдЧреАред рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирдП рд╡рд░реНрдЧ рддрд░реНрдХ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░ рдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмреЗрд╣рддрд░ рд╕реБрд╡рд┐рдзрд╛ рджреА рдЬрд╛рдПрдЧреА - рдЬреЛ рдореМрдЬреВрджрд╛ рд╡рд░реНрдЧ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рд╕рдордиреНрд╡рдп рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬрд╣рд╛рдВ рдЯрдХрд░рд╛рд╡ рд╣реЛрддрд╛ рд╣реИ рд╡рд╣рд╛рдВ рдЙрдЪрд┐рдд рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреЛрдгреАрдп рдЬреИрд╕рд╛ рдврд╛рдВрдЪрд╛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рдЪреБрд░ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдбрд┐рдЬрд╛рдЗрди рд╡рд░реНрдЧ рдХреЛ "рд▓рд╛рдн" рдпрд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕реЗ рдирдП рддрд░реНрдХ рдореЗрдВ рдорд┐рд╢реНрд░рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд╣ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдЗрд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реИ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕рдордиреНрд╡рдп рддрд░реНрдХ рд╕реЗ рд╡рд░реНрдЧ рддрд░реНрдХред рд╡реИрд╕реЗ рднреА рдпрд╣ рдореЗрд░реА _рд╡рд┐рдирдореНрд░_рд░рд╛рдп рд╣реИред :- )

рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ + рд╣реИрдХреНрд╕ рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ рдЙрдЪреНрдЪ рдХреНрд░рдо рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдЗрд╕ рд╕рд╛рдорд╛рди рдХреЗ рд▓рд┐рдП рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрдВрдкреЛрдЬрд╝ + рдПрдЪрдУрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╢рд╛рдпрдж рдЗрд╕ рддрд░рд╣ рд░рд╣реЗрдЧрд╛ ... рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП;) рдПрдордПрд╕ рдЖрджрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗрд╡рд▓ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВ рдФрд░ рдЬрдм рдЖрдк рдПрдВрдЧреБрд▓рд░ рдЬреИрд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рдмрдбрд╝реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ, рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╡реЗ рдХреЗрд╡рд▓ рдЗрд╕ рдХреНрд╖рдорддрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЕрдиреНрдпрдерд╛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдиреБрд░рдХреНрд╖рдХреЛрдВ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред

рдпрд╣ рджреБрдЦрдж рдФрд░ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реИ рдХрд┐ рдЗрддрдиреА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛, рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдлреАрдЪрд░ рд╕рдВрд░рдЪрдирд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдФрд░ рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреА рдЬреБрдбрд╝рд╛рд╡ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИ, рдЯреАрдПрд╕ рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдЗрддрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдРрд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рдХреНрд░рд╛рдВрддрд┐ рд▓рд╛ рд╕рдХрддреА рд╣реИ; рд╣рд░ рдХрд┐рд╕реА рдХреЛ рдмрд┐рдЯрд▓реА рдпрд╛ рдПрдирдкреАрдПрдо рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдкрд░ рдЫреЛрдЯреЗ рдорд┐рд╢реНрд░рдг рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднрдпрд╛рдирдХ рдХреЛрдб рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИред рдЕрдкрдиреА рдЦреБрдж рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдореИрдВ рддреБрд░рдВрдд рдЕрдкрдирд╛ @Poolable @Initable @Translating рдФрд░ рд╢рд╛рдпрдж рдПрдХ рдвреЗрд░ рдФрд░ рдЕрдзрд┐рдХ рдмрдирд╛ рджреВрдВрдЧрд╛ред

рдХреГрдкрдпрд╛ рд╕рднреА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЯреАрдПрд╕ рдХреЛрд░ рдЯреАрдоред рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдЖрдк рд╕рднреА рдХреА рдЬрд░реВрд░рдд рд╣реИ" рдпрд╣ рд╣реИ рдХрд┐ рд▓реМрдЯрд╛рдП рдЧрдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╕рдореНрдорд╛рдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

// taken from my own lib out of context
export function Initable<T extends { new(...args: any[]): {} }>(constructor: T): T & Constructor<IInitable<T>> {
    return class extends constructor implements IInitable<T> {
        public init(obj: Partial<T> | any, mapping?: any) {
            setProperties(this, obj, mapping);
            return this
        }
    }
}

рдЬреЛ рдЗрд╕ рдХреЛрдб рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╢рд┐рдХрд╛рдпрдд рдХреЗ рдЪрд▓рдиреЗ рджреЗрдЧрд╛:

<strong i="14">@Initable</strong>
class Person {
    public name: string = "";
    public age: number = 0;
    public superPower: string | null = null;
}
let sam = new Person();

sam.init({age: 17, name: "Sam", superPower: "badassery"});

@AllNamesRTaken

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВ рдЖрдкрдХреА рдмрд╛рддреЛрдВ рд╕реЗ рд╕рд╣рдордд рд╣реВрдБ, рдЖрдк рд╡рд╣реА рдЪреАрдЬрд╝ рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ:

class Animal {
    constructor(values: Object = {}) {
        Object.assign(this, values);
    }
}

рдФрд░ рдлрд┐рд░ рдЖрдкрдХреЛ рдПрдХ init рдлрд╝рдВрдХреНрд╢рди рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рдЖрдк рдмрд╕ рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

const animal = new Animal({name: 'Fred', age: 1});

@lansana
рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдХрд░реЗрдЧрд╛ рдЬреЛ рд╣рдореЗрд╢рд╛ рд╕реБрдкрд░ рдбреБрдкрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореЗрд░реЗ рдкрд╛рд╕ рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХреЛ рдкреВрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рдорд┐рд╢реНрд░рдг рд╣реИред рдХреЗрд╡рд▓ рд░рдЪрдирд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреА рдЬрд░реВрд░рдд рд╣реИред init рдЙрджрд╛рд╣рд░рдг рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдЕрдиреНрдп рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧреА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

@AllNamesRTaken рдЕрднреА рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЛ рдЫреВрдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд╕ рд░рд╛рдЬреНрдп рдореЗрдВ рдЗрддрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд╣реИ рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд░рдг 2 рдкрд░ рд╣реИред https://github.com/tc39/proposal-decorators рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЙрд╕ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╕рднреА рд╕рд╣рдордд рд╣реЛрдВред

@рдХреБрдХреНрдХреАрдореЛрдирд╕реБрддрд╛
рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЬреЛ рдЕрдиреБрд░реЛрдз рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рди рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ ES рд╕рд╛рдорд╛рди рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдКрдкрд░ рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдмрд╕ рдХрд╛рд╕реНрдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ.

@AllNamesRTaken рдЖрдк рдпрд╣ _today_ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдорд┐рдХреНрд╕рд┐рди рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

function setProperties(t: any, o: any, mapping: any) {}

type Constructor<T> = { new(...args: any[]): T };

interface IInitable<T> {
  init(obj: Partial<T> | any, mapping?: any): this;
}

// taken from my own lib out of context
function Initable<T extends Constructor<{}>>(constructor: T): T & Constructor<IInitable<T>> {
    return class extends constructor implements IInitable<T> {
        public init(obj: Partial<T> | any, mapping?: any) {
            setProperties(this, obj, mapping);
            return this
        }
    }
}

class Person extends Initable(Object) {
    public name: string = "";
    public age: number = 0;
    public superPower: string | null = null;
}
let sam = new Person();
sam.init({age: 17, name: "Sam", superPower: "badassery"});

рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдпрджрд┐ рд╣рдореЗрдВ JS рдореЗрдВ рдорд┐рд╢реНрд░рд┐рдд рдкреНрд░рд╕реНрддрд╛рд╡ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

mixin Initable {
  public init(obj: Partial<T> | any, mapping?: any) {
    setProperties(this, obj, mapping);
    return this
  }
}

class Person extends Object with Initable {
    public name: string = "";
    public age: number = 0;
    public superPower: string | null = null;
}
let sam = new Person();
sam.init({age: 17, name: "Sam", superPower: "badassery"});

@justinfagnani рдорд┐рд╢реНрд░рдг рдпрд╣ рдерд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рд╢реБрд░реБрдЖрдд рдХреА рдФрд░ рдореЗрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

class Person extends Initable(Object) {
    public name: string = "";
    public age: number = 0;
    public superPower: string | null = null;
}
let sam = new Person();     
sam.init({age: 17, name: "Sam", superPower: "badassery"});

рдЬреЛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╕реЗ рдЧреБрдгреЛрдВ рдХреЛ рджреВрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ рднреА init рдХреЗ рд▓рд┐рдП рдЖрдВрд╢рд┐рдХ рдкрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЦреЛ рджреЗрддрд╛ рд╣реИред

рдЗрд╕ рдлреАрдЪрд░ рд╕реЗ рдЖрдк рдЬреНрдпрд╛рджрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ HoC рд▓рд┐рдЦ рдкрд╛рдПрдВрдЧреЗ
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЬреЛрдбрд╝реА рдЬрд╛рдПрдЧреА

@kgtkr рдпрд╣реА рдореБрдЦреНрдп рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдЗрддрдиреА рдмреБрд░реА рддрд░рд╣ рд╕реЗ рдХреНрдпреЛрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ ...

react-router рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдереЛрдбрд╝реА рдЖрдкрд╛рдд рд╕реНрдерд┐рддрд┐ рднреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдХреНрд▓рд╛рд╕ рдбреЗрдХреЛрд░реЗрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЯрд╛рдЗрдк рд╕реБрд░рдХреНрд╖рд╛ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдирд┐рдЪрд▓рд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ withRouter рдХреБрдЫ рдкреНрд░реЙрдкреНрд╕ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрдирд╛рддрд╛ рд╣реИред

рдЕрдм рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЭрдЧрдбрд╝рд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд▓реЛрдЧ рд╕рдЬрд╛рд╡рдЯ рдХреЗ рдмрдЬрд╛рдп withRouter рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реИрдВред

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рд╕реЗ рджреБрдирд┐рдпрд╛ рдХреЛ рдЦреБрд╢рд╣рд╛рд▓ рдЬрдЧрд╣ рдорд┐рд▓ рдЬрд╛рдПрдЧреАред

рд╡рд╣реА рдЭрдЧрдбрд╝рд╛* рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдордЯреЗрд░рд┐рдпрд▓-рдпреВрдЖрдИ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдФрд░ withStyle рдХреЗ рд╕рд╛рде рд╣реБрдЖ рдерд╛, рдЬрд┐рд╕реЗ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЬрд┐рд╕реЗ рдЯрд╛рдЗрдк рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд░реВрдк рдореЗрдВред рднрд▓реЗ рд╣реА рдзреВрд▓ рдЬреНрдпрд╛рджрд╛рддрд░ рдЙрд╕ рдкрд░ рдмрд╕ рдЧрдИ рд╣реЛ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдирдП рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЪрд▓ рд░рд╣реЗ рднреНрд░рдо рдХрд╛ рдПрдХ рд╕реНрд░реЛрдд рд╣реИ!

*рдЦреИрд░, "рдЭрдЧрдбрд╝рд╛" рдПрдХ рдордЬрдмреВрдд рд╢рдмреНрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рдореИрдВ рдЗрд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдЬрдм рддрдХ рдпрд╣ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рддрдм рддрдХ рдЕрдиреНрдп рд▓реЛрдЧ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЖрдЧреЗ рд╕рдВрдЧрдд рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдЫреЛрдЯреА рд╣реИрдХ рд╕реЗ рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ, рдПрдХ рд╕реБрдкрд░ рдмреЗрд╕рд┐рдХ рд╕реНрдХреИрд▓рд╛ рд╕реНрдЯрд╛рдЗрд▓ рдХреЗрд╕ рдХреНрд▓рд╛рд╕ copy рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ ...

рдореЗрд░реЗ рдкрд╛рд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЗрд╕ рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

type Constructor<T> = { new(...args: any[]): T };

interface CaseClass {
  copy(overrides?: Partial<this>): this
}

function CaseClass<T extends Constructor<{}>>(constructor: T): T & Constructor<CaseClass> {
  return class extends constructor implements CaseClass {
    public copy(overrides: Partial<this> = {}): this {
      return Object.assign(Object.create(Object.getPrototypeOf(this)), this, overrides);
    }
  }
}

рдпрд╣ рдХреЛрдб рд╕рдВрд▓рдЧреНрди copy рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдирд╛рдо рд╡рд░реНрдЧ рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдПрдХ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рд▓рдХреНрд╖рд┐рдд рд╡рд░реНрдЧ рдореЗрдВ рдирдИ рд╡рд┐рдзрд┐ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

class MyCaseClass extends CaseClass(class {
  constructor(
    public fooKey: string,
    public barKey: string,
    public bazKey: string
  ) {}
}) {}

MyCaseClass рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдг CaseClass рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдЕрдирд╛рдо рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА copy рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░реЗрдВрдЧреЗред рдФрд░, рдЬрдм рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдШреЛрд╖рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рдХреЛрдб рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдмреНрд▓рд┐рдк рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ <strong i="18">@CaseClass</strong> etc рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЕрдЧрд▓реЗ рдкреНрд░рдореБрдЦ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдЗрд╕реЗ рджреЗрдЦрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ - рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░реЙрдХреНрд╕реА рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдЕрдЬреАрдм рдЧрдбрд╝рдмрдбрд╝реА рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХреНрд▓реАрдирд░ рдФрд░ рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХреЛрдб рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред

рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдХрдм рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧреА?

рдореИрдВ рдмрд╛рд░-рдмрд╛рд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред
рд▓реЗрдХрд┐рди рдЕрдм рдХрдХреНрд╖рд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, рдореБрдЭреЗ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ: Expected 0 arguments, but got 1

function Component<T extends { new(...args: any[]): {} }>(target: T) {
    return class extends target {
        public constructor(...args: any[]) {
            super(...args);
            resolveDependencies(this, args[0])
        }
    }
}

<strong i="8">@Component</strong>
export class ExampleService {
    @Inject(ExampleDao) private exampleDao: ExampleDao;

    // <strong i="9">@Component</strong> will automatically do this for me 
    // public constructor(deps: any) {
    //  resolveDependencies(this, deps);
    // }

    public getExample(id: number): Promise<Example | undefined> {
        return this.exampleDao.getOne(id);
    }
}

new ExampleService({ exampleDao }) // TS2554: Expected 0 arguments, but got 1.

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЬрд▓реНрдж рд╣реА рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧреА! :)

@ iainreid820 рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рдЕрдЬреАрдм рдмрдЧ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛?

рд▓рдВрдмрд╛ рдЗрдВрддрдЬрд╛рд░! рдЗрд╕ рдмреАрдЪ, рдХреНрдпрд╛ рдпрд╣ рд╡рд░реНрддрдорд╛рди рд░реЛрдб рдореИрдк рдкрд░ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рд╕реЗ рд╣рд▓ рд╣реЛ рд░рд╣рд╛ рд╣реИ?
рдЬреИрд╕реЗ рдореБрджреНрджрд╛ 5453 ?

рдореИрдВ рдордЯреЗрд░рд┐рдпрд▓ рдпреВрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдмрд╕ рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдирд╛ рдерд╛ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ withStyles рдХреЗ рд▓рд┐рдП рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: https://material-ui.com/guides/typescript/#decorating -components

рдХреГрдкрдпрд╛ рдЕрдЧрд▓реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рдЙрд╕ рд╕реАрдорд╛ рдХреЛ рдареАрдХ рдХрд░реЗрдВред рдХреНрд▓рд╛рд╕ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдЕрднреА рдореБрдЭреЗ рдмрд╣реБрдд рдмреЗрдХрд╛рд░ рд▓рдЧрддреЗ рд╣реИрдВред

Morphism Js рдХреЗ рдЕрдиреБрд░рдХреНрд╖рдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдмрдбрд╝реА рд╕реАрдорд╛ рд╣реИред рдореБрдЭреЗ рдлрд╝рдВрдХреНрд╢рди рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдЙрдкрднреЛрдХреНрддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖реНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ https://github.com/nobrainr/morphism# --toclassobject-decorator, рдЕрдиреНрдпрдерд╛ HOF рдХреЗ рдмрдЬрд╛рдп рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдмреЗрдХрд╛рд░ рд▓рдЧрддрд╛ рд╣реИ рдореИрдВ
рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ? рдХреНрдпрд╛ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд╣реЛрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ? рдЖрдкрдХрд╛ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рд╣реА рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!

@bikeshedder рдХрд┐ рд╕рд╛рдордЧреНрд░реА UI рдЙрджрд╛рд╣рд░рдг рдПрдХ рдХреНрд▓рд╛рд╕ рдорд┐рдХреНрд╕рд┐рди рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рдФрд░ рдЖрдк рдорд┐рдХреНрд╕рд┐рди рд╕реЗ рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреЗ рдмрдЬрд╛рдп:

const DecoratedClass = withStyles(styles)(
  class extends React.Component<Props> {
...
}

рд▓рд┐рдЦреЛ:

class DecoratedClass extends withStyles(styles)(React.Component<Props>) {
...
}

@justinfagnani рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

ss 2018-10-16 at 10 00 47

рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдХреЛрдб рд╣реИ: https://gist.github.com/G-Rath/654dff328dbc3ae90d16caa27a4d7262

@ рдЬреА-рд░рде рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп new () => React.Component<Props, State> рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

@emyann рдХреЛрдИ рдкрд╛рд╕рд╛ рдирд╣реАрдВред рдореИрдВрдиреЗ рдирдП рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдпрд╣реА рдорддрд▓рдм рд╣реИ?

class CardSection extends withStyles(styles)(new () => React.Component<Props, State>) {

рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, extends withStyles(styles)(...) рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдЪрд┐рдд рд╕реБрдЭрд╛рд╡ рдХреА рддрд░рд╣ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред withStyles рдПрдХ рдХреНрд▓рд╛рд╕ рдорд┐рдХреНрд╕рд┐рди рдирд╣реАрдВ рд╣реИред

withStyles рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреНрд▓рд╛рд╕ A рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдХреНрд▓рд╛рд╕ B рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдЬрдм рд░реЗрдВрдбрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдХреНрд▓рд╛рд╕ A рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдк + classes рдкреНрд░реЛрдк рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рд╕реНрдЯрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдмрдврд╝рд╛рддреЗ рд╣реИрдВ рддреЛ рдЖрдк A рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп B рд░реИрдкрд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ classes рдкреНрд░реЛрдк рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред

рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╕реНрдЯрд╛рдЗрд▓реНрд╕ (рд╢реИрд▓рд┐рдпреЛрдВ) (...) рдХреЗ рд╕рд╛рде рдлреИрд▓рддрд╛ рд╣реИ, рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдЪрд┐рдд рд╕реБрдЭрд╛рд╡ рдХреА рддрд░рд╣ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред withStyles рдПрдХ рдХреНрд▓рд╛рд╕ рдорд┐рдХреНрд╕рд┐рди рдирд╣реАрдВ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВред рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣рд╛рдБ рдЗрддрдирд╛ рдкреБрд╢рдмреИрдХ рдХреНрдпреЛрдВ рд╣реИред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореИрдВ рдЬреЛ рд╕реБрдирддрд╛ рд╣реВрдВ, рдЙрд╕рд╕реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдЪрд░рдг 3 рдХреЗ рдмреЗрд╣рдж рдХрд░реАрдм рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯреАрдПрд╕ рдХреЛ рдЬрд▓реНрдж рд╣реА рдпрд╣рд╛рдВ рдЙрдЪрд┐рдд рд╕рдорд░реНрдерди рдорд┐рд▓реЗрдЧрд╛ред

рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рд╕реБрдирддрд╛ рд╣реВрдВ рдЬреЛ рдХреНрд▓реАрдирд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, espред рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ HoCs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордпред рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкрд╛рдЗрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдХрдИ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ рд▓рдкреЗрдЯрдирд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЙрд╕ рд╢реБрджреНрдз рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдШрдЯрдХ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рд╣реИред рдЬреИрд╕реЗ

@flow([
  withStyles(styles),
  connect(mapStateToProps),
  decorateEverything(),
])
export class HelloWorld extends Component<Props, State> {
  ...
}

рдЬрд╣рд╛рдВ flow рд╣реИ lodash.flow ред рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрдкрдпреЛрдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ - recompose , Rx.pipe рдЖрджрд┐ред рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд╕рд░рд▓ рдкрд╛рдЗрдк рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕реЗ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИ,

export const decoratedHelloWorld = withStyles(styles)(
  connect(mapStateToProps)(
    decorateEverything(
       HelloWorld
))))

рдПрдХ рдФрд░ рдХрд╛рд░рдг рдЬреЛ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕реНрдкреЗрдХ рдХреА рдШреЛрд╖рдгрд╛ рдФрд░ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣ рдкреИрдЯрд░реНрди рдЖрд╕рд╛рдиреА рд╕реЗ рдвреВрдВрдв-рдФрд░-рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди-рд╕рдХреНрд╖рдо/grep-рд╕рдХреНрд╖рдо рд╣реИред

@justinfagnani рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ рдореБрдЭреЗ ESLint рд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ рдЬрдм рдореИрдВ extends React.Component<Props, State> рдХреЛ extends withStyles(styles)(React.Component<Props, State>) рдореЗрдВ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрд╕реА рддрд░рд╣ @ рдЬреА-рд░рде рдХреА рдЯрд╛рдЗрдк рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред

рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ new (рд╢рд╛рдпрдж рд╡рд╣реА рд╕рдорд╕реНрдпрд╛?) рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИ:

class MyComponent extends React.Component<Props, State> {
  /* ... */
}

const _MyComponent = withStyles(styles)(MyComponent)
const test = new _MyComponent // <--------- ERROR

рдФрд░ рддреНрд░реБрдЯрд┐ рд╣реИ:

Cannot use 'new' with an expression whose type lacks a call or construct signature.

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╕рд╛рдордЧреНрд░реА рдпреВрдЖрдИ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдирд╣реАрдВ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)?

@ рд╕рд╛рдЧрд░-рдПрд╕рдПрдо рд▓реЗрдХрд┐рди, рдХреНрдпрд╛ рдЖрдкрдХреЛ рд╕рд╛рдордЧреНрд░реА рдпреВрдЖрдИ рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдмрдврд╝рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ? рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдк рдХрд░реЗрдВрдЧреЗред

рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕ рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╕рд╛рдордЧреНрд░реА UI рдХреЗ withStyles рдХреЛ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рдерд╛, рдЬреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдпрд╣ рдкреНрд░рд╢реНрди рдкреВрдЫрд╛: https://stackoverflow.com/questions/53138167

рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо async рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмреНрд▓реВрдмрд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдореИрдВрдиреЗ рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдПрдЯреАрдПрдо рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

рдкрд╣рд▓реЗ рдпрд╣рд╛рдБ рдореЗрд░рд╛ "рдорд┐рдХреНрд╕рд┐рди" рдбреЗрдХреЛрд░реЗрдЯрд░ рд╣реИ

export type Ctor<T = {}> = new(...args: any[]) => T 
function mixinDecoratorFactory<MixinInterface>() {
    return function(toBeMixed: MixinInterface) {
        return function<MixinBase extends Ctor>(MixinBase: MixinBase) {
            Object.assign(MixinBase.prototype, toBeMixed)
            return class extends MixinBase {} as MixinBase & Ctor<MixinInterface>
        }
    }
}

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдмрдирд╛рдПрдВ

export interface ComponentInterface = {
    selector: string,
    html: string
}
export const Component = mixinDecoratorFactory<ComponentInterface>();

рдФрд░ рдЗрд╕ рддрд░рд╣ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

@Component({
    html: "<div> Some Text </div>",
    selector: "app-test"
})
export class Test extends HTMLElement {
    test = "test test"
    constructor() {
        super()
        console.log("inner;     test:", this.test)
        console.log("inner;     html:", this.html)
        console.log("inner; selector:", this.selector)
    }
}

export interface Test extends HTMLElement, ComponentInterface {}
window.customElements.define(Test.prototype.selector, Test)


const test = new Test();
console.log("outer;     test:", test.test)
console.log("outer;     html:", test.html)
console.log("outer; selector:", test.selector)

рдЯреНрд░рд┐рдХ рдПрдХ рдорд░реНрдЬ рдХрд┐рдП рдЧрдП рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рдорд╛рди рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рднреА рдмрдирд╛рдирд╛ рд╣реИред
рдлрд┐рд░ рднреА рд╡рд░реНрдЧ рдХреЗрд╡рд▓ Test рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдЬрд╛рдВрдЪ рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИред
рдпрджрд┐ рдЖрдк @ рдХреЗ рдмрд┐рдирд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ - рдиреЛрдЯреЗрд╢рди рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рддреЛ рдЖрдкрдХреЛ рд╕рд╣реА рдЪреМрд░рд╛рд╣реЗ-рдкреНрд░рдХрд╛рд░ рдорд┐рд▓реЗрдЧрд╛ рд▓реЗрдХрд┐рди рдХрдХреНрд╖рд╛ рдХреЗ рдЕрдВрджрд░ рд╣реА рдЯрд╛рдЗрдк-рдЪреЗрдХрд┐рдВрдЧ рдХреА рдХреНрд╖рдорддрд╛ рдЦреЛ рдЬрд╛рдПрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЪрд╛рд▓ рдЕрдм рдФрд░ рдпрд╣ рдФрд░ рдЕрдзрд┐рдХ рдмрджрд╕реВрд░рдд рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдЬреИрд╕реЗ:

let Test2Comp = Component({
    html: "<div> Some Text 2 </div>",
    selector: "app-test2"
}) (
class Test2 extends HTMLElement {
    test = "test test"
    constructor() {
        super()
        console.log("inner;     test:", this.test)
        console.log("inner;     html:", this.html)     // no
        console.log("inner; selector:", this.selector) // no
    }
})

interface Test2 extends HTMLElement, ComponentInterface {} //no
window.customElements.define(Test2Comp.prototype.selector, Test2Comp)

const test2 = new Test2Comp();
console.log("outer;     test:", test2.test)
console.log("outer;     html:", test2.html)
console.log("outer; selector:", test2.selector)

рдЖрдк рдЗрди рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд╣рддреЗ рд╣реИрдВ? рдпрд╣ рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рд╣реБрдИ рд╣реИ? рдпрд╣ рдПрдХ рдмрд╣реБрдд, рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдЬреЛ рдмрд╣реБрдд рд╕рд╛рд░реА рд╡рд┐рднрд┐рдиреНрди рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдЕрдирд▓реЙрдХ рдХрд░реЗрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдЕрднреА рдЬреНрдпрд╛рджрд╛рддрд░ рдмрд╛рд╕реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдЕрднреА рднреА рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╣реИрдВ?

рдЗрд╕ @andy-ms @ahejlsberg @sandersn рдкрд░ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдмрдпрд╛рди рджреЗрдирд╛ рд╡рд╛рдХрдИ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред ЁЯЩП

рдЬрдм рддрдХ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛, рддрдм рддрдХ рд╣рдо рдпрд╣рд╛рдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

@DanielRosenwasser - рдпрд╣рд╛рдБ "рдЕрдВрддрд┐рдо рд░реВрдк" рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ? рдХреНрдпрд╛ TC39 рдореЗрдВ рд╕реНрдЯреЗрдЬ 3 рдпреЛрдЧреНрдп рд╣реИ?

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рд╡реЗ рдЗрддрдиреА рджреВрд░ рдкрд╣реБрдВрдЪ рдЧрдП рд╣реЛрдВрдЧреЗ! рд╡реЗ рд╕реНрдЯреЗрдЬ 3 рдкрд░ рдХрдм рдкрд╣реБрдВрдЪреЗ? рдХреНрдпрд╛ рд╡рд╣ рд╣рд╛рд▓ рд╣реИ?

рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрднреА рддрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ; рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╡реЗ рдЬрдирд╡рд░реА рдЯреАрд╕реА39 рдХреА рдмреИрдардХ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд╕реНрдЯреЗрдЬ 2 рд╕реЗ рд╕реНрдЯреЗрдЬ 3 рддрдХ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред

рдЖрдк рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдПрдЬреЗрдВрдбреЗ рдкрд░ рдирдЬрд░ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рд╣реА (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдкреБрд╖реНрдЯрд┐ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ рдпрд╣ рдЬрдирд╡рд░реА рдореЗрдВ рдкреНрд░рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ)ред рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдкреВрдЫ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рд╕реНрдЯреЗрдЬ 3 рд╡рд╣рд╛рдВ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░ рдХреНрд╡рд╛рд▓реАрдлрд╛рдИ рдХрд░ рдкрд╛рдПрдЧрд╛ред

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдбреЗрдХреЛрд░реЗрдЯрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЕрднреА рднреА рдХрдИ рдЧрдВрднреАрд░ рдореБрджреНрджреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдпрд╣ рдЬрдирд╡рд░реА рдореЗрдВ рдЪрд░рдг 3 рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдорд╕реНрдпрд╛рддреНрдордХ рд╡рд░реНрдЧ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рддрд░рд╣ рдлрд┐рд░ рд╕реЗ рдЧрд▓рддреА рдХрд░реЗрдЧрд╛ред

@hax рдХреНрдпрд╛ рдЖрдк рд╡рд┐рд╕реНрддреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдкрд░ рд╕рдВрдЪрд╛рд░ рдХреА рдХрдореА рдХреЛ рджреБрдЦрдж рдкрд╛рддрд╛ рд╣реВрдВ рдФрд░ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реБрдирд╛ рд╣реИред

@AllNamesRTaken рдбреЗрдХреЛрд░реЗрдЯрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рдЬрд╛рд░реА рд╕реВрдЪреА рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, export рдкрд╣рд▓реЗ/рдмрд╛рдж рдореЗрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рддрд░реНрдХ рдЪрд░рдг 3 рдХрд╛ рдЕрд╡рд░реЛрдзрдХ рд╣реИред

рд░рд┐рдбрд┐рдЬрд╛рдЗрди рдПрдкреАрдЖрдИ рдЬреИрд╕реЗ рдХреБрдЫ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдмрджрд▓рд╛рд╡ рднреА рд╣реИрдВ, рдЬреЛ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдЪрд░рдг 3 рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИред

рдФрд░ рдпрд╣ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╡рд░реНрдЧ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рднреА рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрдХреНрд╖рд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдЪрд░рдг 3 рддрдХ рдкрд╣реБрдВрдЪ рдЪреБрдХреЗ рд╣реИрдВ, рдлрд┐рд░ рднреА рдмрд╣реБрдд рд╕рд╛рд░реЗ рдореБрджреНрджреЗ рд╣реИрдВред рдореБрдЭреЗ рдЪрд┐рдВрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХрдИ рдореБрджреНрджреЛрдВ рдХреЛ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрд░рдХреНрд╖рд┐рдд ) рдкрд░ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рджреЛрдиреЛрдВ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдмреБрд░рд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ, рдореИрдВ TC39 рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдирд╣реАрдВ рд╣реВрдВ, рдФрд░ рдХреБрдЫ TC39 рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХрдИ рдореБрджреНрджреЛрдВ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рдХрднреА рд╕рд╣рдордд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореЗрд░реА рджреГрдврд╝ рд░рд╛рдп рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдЯреАрд╕реА39 рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрдИ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдореБрджреНрджреЛрдВ рдкрд░ рдмрдбрд╝реА рд╡рд┐рдлрд▓рддрд╛рдПрдВ рд╣реИрдВред рдХреБрдЫ рдореБрджреНрджреЛрдВ рдХреЛ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрдердЧрд┐рдд рдХрд░реЗрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдмрд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдирд╛рдЬреБрдХ рдмрдирд╛рддреЗ рд╣реИрдВред)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрди рдЪреАрдЬреЛрдВ рдХрд╛ рдкрддрд╛ рдЪрд▓ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдареАрдХ рд░рд╣реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд╣рдо рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рдЪрд░реНрдЪрд╛ рди рдХрд░реЗрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЪрд░рдг 3 рдкрд░реНрдпрд╛рдкреНрдд рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЗ рд╕рд╛рде рдпрд╛ рдЪрд░рдг 4 рд╢рд╛рдпрдж рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рд╣рдо рдирдП рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдлрд┐рд░ рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдзрдиреНрдпрд╡рд╛рдж рдбреИрдирд┐рдпрд▓! рдЪрд░рдг 3 рдЖрдорддреМрд░ рдкрд░ 4 рдореЗрдВ рдПрдХ рдордЬрдмреВрдд рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд╛ рдЕрд░реНрде рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдирд╡рд░реА рдХреА рдмреИрдардХ рдХреЗ рд▓рд┐рдП рдЙрдВрдЧрд▓рд┐рдпрд╛рдВ рдкрд╛рд░ рд╣реЛ рдЧрдИрдВред

рдФрд░ рдпрд╣рд╛рдВ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреА рдЪрд░реНрдЪрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рдЕрдЬреАрдмреЛрдЧрд░реАрдм рд╣реИ рдХрд┐ рдЗрд╕ рдлреАрдЪрд░ рдХреЗ рдХрд╛рд░рдг рдЧреБрд╕реНрд╕рд╛ рдФрд░ рдмрд╛рдЗрдХ рд╢реЗрдбрд┐рдВрдЧ рдХрд╛ рд╕реНрддрд░ рдмрдврд╝ рдЧрдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдРрд╕рд╛ рдХреБрдЫ рдХрднреА рдирд╣реАрдВ рджреЗрдЦрд╛

рд╕рд┐рд░реНрдл рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рдерд╛: https://github.com/Microsoft/TypeScript/issues/8545

рдЬрдм рдЖрдк рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ (https://github.com/Microsoft/TypeScript/wiki/What%27s-new-in-TypeScript#better-handling-for-namespace-patterns-in) рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрд╖реНрдЯрдкреНрд░рдж рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдПрдХ рд╣рдж рддрдХ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред -рдЬреЗрдПрд╕-рдлрд╛рдЗрд▓реЗрдВ):

// javascript via typescript
var obj = {};
obj.value = 1;
console.log(obj.value);

рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдХреЗ рд▓рд┐рдП рднреА, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЬрдм рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ (!)(https://github.com/Microsoft/TypeScript/wiki/What%27s-new-in-TypeScript#properties-declarations-on-functions):

function readImage(path: string, callback: (err: any, image: Image) => void) {
    // ...
}

readImage.sync = (path: string) => {
    const contents = fs.readFileSync(path);
    return decodeImageSync(contents);
}

@DanielRosenwasser @arackaf рд╕реНрдЯреЗрдЬ 3 рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдХреЛрдИ рд╢рдмреНрдж? рдореИрдВ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рд╕рдЬрд╛рд╡рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХрдХреНрд╖рд╛ рдореЗрдВ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рд╡реЗ рдирд╡реАрдирддрдо TC39 рдмреИрдардХ рдореЗрдВ рдЖрдЧреЗ рдирд╣реАрдВ рдмрдврд╝реЗ; рд╡реЗ рдЕрдЧрд▓реА рдмреИрдардХ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЙрдиреНрдирддрд┐ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ; рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рд╡рд╛ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рд╣реИред

рдпрд╣рд╛рдВ рдЬреЛ рд▓реЛрдЧ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рдПрдЧреА - рдЬреЛ рд╣рдо рдореЗрдВ рд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕рд╛рде рд╣реА рдЯреАрдПрд╕ рдЕрдиреБрд░рдХреНрд╖рдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╢реЛрд░ рдХреЛ рдХрдо рдХрд░реЗрдЧрд╛ред

рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ?

рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб (рдХреЛрдгреАрдп :)) https://stackblitz.com/edit/iw-ts-extends-with-fakes?file=src%2Fapp%2Fextends-with-fakes.ts

import { Type } from '@angular/core';

export function ExtendsWithFakes<F1>(): Type<F1>;
export function ExtendsWithFakes<F1, F2>(): Type<F1 & F2>;
export function ExtendsWithFakes<F1, F2, F3>(): Type<F1 & F2 & F3>;
export function ExtendsWithFakes<F1, F2, F3, F4>(): Type<F1 & F2 & F3 & F4>;
export function ExtendsWithFakes<F1, F2, F3, F4, F5>(): Type<F1 & F2 & F3 & F4 & F5>;
export function ExtendsWithFakes<RealT, F1>(realTypeForExtend?: Type<RealT>): Type<RealT & F1>;
export function ExtendsWithFakes<RealT, F1, F2>(realTypeForExtend?: Type<RealT>): Type<RealT & F1 & F2>;
export function ExtendsWithFakes<RealT, F1, F2, F3>(realTypeForExtend?: Type<RealT>): Type<RealT & F1 & F2 & F3>;
export function ExtendsWithFakes<RealT, F1, F2, F3, F4>(
    realTypeForExtend?: Type<RealT>
): Type<RealT & F1 & F2 & F3 & F4>;
export function ExtendsWithFakes<RealT, F1, F2, F3, F4, F5>(
    realTypeForExtend?: Type<RealT>
): Type<RealT & F1 & F2 & F3 & F4 & F5> {
    if (realTypeForExtend) {
        return realTypeForExtend as Type<any>;
    } else {
        return class {} as Type<any>;
    }
}

interface IFake {
    fake(): string;
}

function UseFake() {
    return (target: Type<any>) => {
        target.prototype.fake = () => 'hello fake';
    };
}

class A {
    a() {}
}

class B {
    b() {}
}

@UseFake()
class C extends ExtendsWithFakes<A, IFake, B>(A) {
    c() {
        this.fake();
        this.a();
        this.b(); // failed at runtime
    }
}

рдЖрдк рдЗрд╕ "рдЗрд╕ рдмреАрдЪ" рдЖрд╕рд╛рди рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ?
https://stackoverflow.com/a/55520697/1053872

Mobx-state-tree рдЕрдкрдиреЗ cast() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд▓реЗрдХрд┐рди... рдпрд╣ рдореБрдЭреЗ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЬрдм рднреА рдХреБрдЫ рдмреЗрд╣рддрд░ рдЖрддрд╛ рд╣реИ рддреЛ рдЗрд╕реЗ рдирд┐рдХрд╛рд▓рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕ тЭдя╕П . рдХреА рддрд░реНрдЬ рдкрд░ рдХреБрдЫ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛
рдХреНрдпрд╛ рдпрд╣ рд╡рд╣ рд╢рдХреНрддрд┐ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рдкрд╛рд╕ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП?

class B<C = any> {}

function ChangeType<T>(to : T) : (from : any) => T;
function InsertType<T>(from : T) : B<T>;

@ChangeType(B)
class A {}

// A === B

// or

<strong i="7">@InsertType</strong>
class G {}

// G === B<G>

const g = new G(); // g : B<G>

A === B // equals true

const a : B = new A();  // valid
const b = new B();

typeof a === typeof b // valid

рдореИрдВрдиреЗ рд╕рдЬрд╛рдП рдЧрдП рд╡рд░реНрдЧ рдЧреБрдгреЛрдВ рдХреЛ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдмрдирд╛рдиреЗ рдореЗрдВ рдХрд╛рдлреА рд╕рдордп рдмрд┐рддрд╛рдпрд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЗ рдЙрдкрдпреЛрдЧреА рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдореЗрд░реА рдкреЛрд╕реНрдЯ рдХреЛ рдорд╛рдзреНрдпрдо рдкрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ

рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ?

рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдХреНрдпрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ, рдпрд╣ рдЕрдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?

рдЖрдк рдЙрд╕ рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рдХреНрд╕рд┐рди-рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
https://mariusschulz.com/blog/mixin-classes-in-typescript

@ рдмрдирдпрд╛ рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдо рдЕрднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВ;)ред
рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╣рдореЗрдВ рдРрд╕реА рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдиреЗ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рд╣рдо рдХрднреА рднреА рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рд╣рдо рдкреБрд░рд╛рдиреЗ рд╕реНрдХреВрд▓ рдЬрд╛рд╡рд╛ рдХрд░ рд░рд╣реЗ рдереЗред рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдПрдХ рдмрд╣реБрдд рд╕рд╛рдл рдФрд░ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╕рдВрд░рдЪрдирд╛ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рд╡рд░реНрдЧ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рдБ рдорд┐рдХреНрд╕рд┐рдВрд╕ рдЗрд╕реЗ рдХрд░ рд╕рдХрддреЗ рдереЗ рд▓реЗрдХрд┐рди рдпрд╣ рдмреИрдВрдбреЗрдб рд╣реИред

рдбреЗрдХреЛрд░реЗрдЯрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд┐рдЫрд▓реЗ рдорд╣реАрдиреЛрдВ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ - рдпрд╣ рдмреЗрд╣рдж рдЕрд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЯреАрдПрд╕ рдЯреАрдо рдХрд┐рд╕реА рднреА рд╕рдордп рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдирд┐рд╡реЗрд╢ рдХрд░реЗрдЧреА рдЬреЛ рдЬрд▓реНрдж рд╣реА рдЕрд╕рдВрдЧрдд рд╣реЛрдЧреАред

рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ:

рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдкреНрд░рд╕реНрддрд╛рд╡: https://github.com/tc39/proposal-decorators
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░реЛрдбрдореИрдк: https://github.com/microsoft/TypeScript/wiki/Roadmap

@ рдмрдирдпрд╛ рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдо рдЕрднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВ;)ред
рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╣рдореЗрдВ рдРрд╕реА рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдиреЗ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рд╣рдо рдХрднреА рднреА рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рд╣рдо рдкреБрд░рд╛рдиреЗ рд╕реНрдХреВрд▓ рдЬрд╛рд╡рд╛ рдХрд░ рд░рд╣реЗ рдереЗред рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдПрдХ рдмрд╣реБрдд рд╕рд╛рдл рдФрд░ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╕рдВрд░рдЪрдирд╛ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рд╡рд░реНрдЧ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рдБ рдорд┐рдХреНрд╕рд┐рдВрд╕ рдЗрд╕реЗ рдХрд░ рд╕рдХрддреЗ рдереЗ рд▓реЗрдХрд┐рди рдпрд╣ рдмреИрдВрдбреЗрдб рд╣реИред

рдпрд╣ рдорд┐рд╢реНрд░рдг рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рд╡рд░реНрдЧ рд╣реИред
рдпрд╣ рдЦрд░рд╛рдм-рдХреЙрдкреА-рд╕рд╛рдорд╛рди рдорд┐рд╢реНрд░рдг рдирд╣реАрдВ рд╣реИ
рдЬрдм рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдСрдкрд░реЗрдЯрд░ рдЖрдПрдЧрд╛, рддреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рднреА рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛

рдЖрдк рдЙрд╕ рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рдХреНрд╕рд┐рди-рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреНрд▓рд╛рд╕-рдлрд╝реИрдХреНрдЯрд░реА рдорд┐рдХреНрд╕рд┐рди рдПрдХ рджрд░реНрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ; рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╡реЗ рдирд╣реАрдВ рднреА рдереЗ, рддреЛ рд╡реЗ рдЖрдкрдХреЛ рдорд┐рдХреНрд╕рд┐рди рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рдмрд╣реБрдд рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯреА рд╣реИрдВ, рдЬреЛ рдХрднреА-рдХрднреА рдЖрдк рдХреЗрд╡рд▓ рддрдм рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдЬрдм рдЖрдк рддреГрддреАрдп-рдкрдХреНрд╖ рдХрдХреНрд╖рд╛рдПрдВ рдЖрдпрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реЛрдВред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд╣реБрдд рдмреЗрд╣рддрд░, рд╕рд░рд▓, рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд╣реИ, рдФрд░ рдЖрдпрд╛рддрд┐рдд рддреГрддреАрдп рдкрдХреНрд╖ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рд╛рджреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдареАрдХ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рд░рд╛рд╕рдд-рд╢реИрд▓реА рдХреЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓реЗрд╢рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди class es рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореВрд▓ class es рд░рд╣рддрд╛ рд╣реИ:

class One {
    one = 1
    foo() { console.log('foo', this.one) }
}

class Two {
    two = 2
    bar() { console.log('bar', this.two) }
}

class Three extends Two {
    three = 3
    baz() { console.log('baz', this.three, this.two) }
}

@with(Three, One)
class FooBar {
    yeah() { console.log('yeah', this.one, this.two, this.three) }
}

let f = new FooBar()

console.log(f.one, f.two, f.three)
console.log(' ---- call methods:')

f.foo()
f.bar()
f.baz()
f.yeah()

рдФрд░ рдХреНрд░реЛрдо рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ:

1 2 3
 ---- call methods:
foo 1
bar 2
baz 3 2
yeah 1 2 3

рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрдкрдХреЛ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЗ рдмрд┐рдирд╛, рдХреНрд▓рд╛рд╕-рдлреИрдХреНрдЯреНрд░реА рдорд┐рдХреНрд╕рд┐рди рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЖрд╕-рдкрд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рд░реИрдкрд░ рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдбреЗрдХреЛрд░реЗрдЯрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ

рдЗрд╕рд▓рд┐рдП, рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдПрдХрдорд╛рддреНрд░ рдЪреЗрддрд╛рд╡рдиреА рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╕рджрд╕реНрдп рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ:

// `multiple` is similar to `@with`, same implementation, but not a decorator:
class FooBar extends multiple(Three, One) {
    yeah() { console.log('yeah', this.one, this.two, this.three) }
}

рд╕рдВрд░рдХреНрд╖рд┐рдд рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдЦреЛрдиреЗ рдХреЗ рдореБрджреНрджреЗ рдХреЛ multiple рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЗрди рджреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдкреНрд░рдХрд╛рд░ рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд░рдирдЯрд╛рдЗрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ):

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╕рджрд╕реНрдпреЛрдВ рд╕рд╣рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдореИрдк рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдЬрд╛рд╡рдЯреА рд╣реИ рдЬреЛ рдХрдХреНрд╖рд╛ рдХреЛ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд░реВрдк рдореЗрдВ рдмреБрд▓рд╛рдП рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдпрд╣ рд╕рд╣реА рд╣реИ:

export const MyClass = withFnConstructor(class MyClass {});

рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

<strong i="10">@withFnConstructor</strong>
export class MyClass {}

рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рдорд░реНрдЬрд┐рдВрдЧ рдФрд░ рдПрдХ рдХрд╕реНрдЯрдо рдЯрд╛рдЗрдк рдбреЗрдлрд┐рдирд┐рд╢рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдиреЙрдЯ-рд╕реЛ-рд╣рд╛рд░реНрдб-рдЯреВ-рдХреНрд▓реАрди-рд╡реНрд╣реЗрди-рдж-рдлреАрдЪрд░-рдХрдореНрд╕-рдЖрдЙрдЯ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣ рд╣реЛрдирд╛:

// ClassModifier.ts
export interface Mod {
  // ...
}
// The decorator
export function ClassModifier<Args extends any[], T>(target: new(...args: Args) => T): new(...args: Args) => T & Mod {
  // ...
}
// MyClass.ts
<strong i="9">@ClassModifier</strong>
export MyClass {
  // ...
}

рдирд┐рдореНрди рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ (рд╕реБрд╡рд┐рдзрд╛ рд╕рд╛рдордиреЗ рдЖрдиреЗ рдХреЗ рдмрд╛рдж рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛):

// MyClass.d.ts
import { MyClass } from './MyClass';
import { Mod } from './ClassModifier';

declare module './MyClass' {
  export interface MyClass extends Mod {}
}

рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди

declare class Extras { x: number };
this.Extras = Object;

class X extends Extras {
   constructor() {  
      super(); 
      // a modification to object properties that ts will not pick up
      Object.defineProperty(this, 'x', {value: 3});
   }
}

const a = new X()
a.x // 3

2015 рдореЗрдВ рд╢реБрд░реВ рд╣реБрдЖ рдФрд░ рдЕрднреА рднреА рд▓рдВрдмрд┐рдд рд╣реИред рдХрдИ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЗ рд╣реИрдВ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рд▓реЗрдЦ рднреА рд╣реИрдВ https://medium.com/p/caf24aabcb59/responses/show , рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдЬреЛ рдереЛрдбрд╝рд╛ рд╣реИрдХреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдорджрджрдЧрд╛рд░ рд╣реИрдВ)

рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрд░ рдХреБрдЫ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдХреНрдпрд╛ рдЗрд╕реЗ рдЕрднреА рддрдХ рдЖрдВрддрд░рд┐рдХ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рднреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ?

tl; dr - рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ TC39 рдореЗрдВ рдЬрд╛рдо рд╣реЛ рдЧрдИ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЯреАрдПрд╕ рд▓реЛрдЧреЛрдВ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рджреЛрд╖ рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗред рд╡реЗ рддрдм рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдорд╛рдирдХ рди рд╣реЛред

рд▓реЗрдХрд┐рди рдпрд╣ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рд╣реИ, рд╡реЗ рдмрд╕ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдорд╛рдирдХреЛрдВ рд╕реЗ рд▓реЛрдЧ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ - "рджреЗрдЦреЛ, рд▓реЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ": рдЯреНрд░реЛрд▓рдлреЗрд╕:

рдпрд╣рд╛рдВ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ _рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ (рдкреАрдЫреЗ рдХреА рдУрд░ рдЕрд╕рдВрдЧрдд рддрд░реАрдХреЛрдВ рд╕реЗ) рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдПрдХ рджрд░реНрджрдирд╛рдХ рд╕реНрдерд┐рддрд┐ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ рдЬрдм рдирдП рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рд▓реЛрдЧ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╡рд░реНрддрдорд╛рди рдбреЗрдХреЛрд░реЗрдЯрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рд╢рдмреНрджрд╛рд░реНрде рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореБрдЭреЗ рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреАрдо рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рд╡рд░реНрддрдорд╛рди рдЧреИрд░-рдорд╛рдирдХ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рдЖрдЧреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рдорд┐рд▓реЗрдЧрд╛, рдЬреЛ рдЕрдВрддрддрдГ рдХрд┐рд╕реА рднреА рдирдП рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордг рдХреЛ рдФрд░ рднреА рджрд░реНрджрдирд╛рдХ рдмрдирд╛ рджреЗрдЧрд╛ред рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдРрд╕рд╛ рд╣реЛрддреЗ рд╣реБрдП рдирд╣реАрдВ рджреЗрдЦрддрд╛ред

рд╕рдВрдпреЛрдЧ рд╕реЗ, рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ #36348 рдмрдирд╛рдпрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдРрд╕реА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ рдЬреЛ рдПрдХ рдмрд╣реБрдд рд╣реА рдареЛрд╕ рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред рдмреЗрдЭрд┐рдЭрдХ рдЗрд╕реЗ рджреЗрдЦреЗрдВ/рдЗрд╕ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдВ/рд╕реИрд╡реЗрдЬ рдХрд░реЗрдВред рдореИрдВ

tl; dr - рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ TC39 рдореЗрдВ рдЬрд╛рдо рд╣реЛ рдЧрдИ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЯреАрдПрд╕ рд▓реЛрдЧреЛрдВ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рджреЛрд╖ рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗред рд╡реЗ рддрдм рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдорд╛рдирдХ рди рд╣реЛред

рдЗрд╕ рддрдереНрдп рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╡рд┐рдХрд╛рд╕ рдЯреАрдо рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд╡рд░рд┐рдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдФрд░ рд╕реНрдерд┐рддрд┐ рдЕрджреНрдпрддрди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрджреНрдзрд┐рдорд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдмрд╛рддрдЪреАрдд рдХреЛ рддрдм рддрдХ рд▓реЙрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЯреАрд╕реА39 рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдЪрд░рдг рдореЗрдВ рдЖрдЧреЗ рдирд╣реАрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ?

рдХреНрдпрд╛ рдЗрд╕реЗ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рдХрд╛ рднреА рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдИ рд╡рдЬрди рд╣реИ?

рджрд░рдЕрд╕рд▓, рд▓рдЧрднрдЧ рд╣рд░ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдмрд╛рддрдЪреАрдд рд╣рд╡рд╛ рдореЗрдВ рд▓рдЯрдХреА рд╣реБрдИ рд╣реИред рдЙрджрд╛рд╣рд░рдг: https://github.com/Microsoft/TypeScript/issues/2607

рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рднрд╡рд┐рд╖реНрдп рдкрд░ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдорджрджрдЧрд╛рд░ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛред рд╕реНрдкрд╖реНрдЯ рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХреЗ рдмрд┐рдирд╛ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХрд╛ рднрд╡рд┐рд╖реНрдп рдзреБрдВрдзрд▓рд╛ рд╣реИ

рдореБрдЭреЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ рдЕрдЧрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреАрдо рдбреЗрдХреЛрд░реЗрдЯрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдХреНрд░рд┐рдп рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛ рд╕рдХрддреА рд╣реИ, рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╢реНрд░реГрдЦрдВрд▓рд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреАред рдореБрдЭреЗ рднреА рдорджрдж рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рднрд╛рд╖рд╛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕рд░реНрд╡реЛрддреНрддрдо рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП: - /

рдореИрдВ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреВрд░реА рдЯреАрдо, рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ - рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдХреЛрдИ рдирдпрд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рддрдп рдФрд░ рдкреБрд╖реНрдЯрд┐ рди рд╣реЛ рдЬрд╛рдП, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдХреИрд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╣рд▓реЗ рд╣реА рдЕрд▓рдЧ рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрднреА рднреА рд╕рдХреНрд░рд┐рдп рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╣реИ, рдФрд░ рдЗрд╕ рд╕рдкреНрддрд╛рд╣ TC39 рдореЗрдВ рдЖрдпрд╛ рдерд╛ https://github.com/tc39/proposal-decorators/issues/305

@orta рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЙрдХреНрд╕ рдХреЛ рддрдм рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдкреНрд░рдХрдЯ рдХрд░рддрд╛ рд╣реИ рдХреА

рдпрджрд┐ рдХреНрд▓рд╛рд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХреНрд▓рд╛рд╕ рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рдХреЛ рджрд┐рдП рдЧрдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрдВрдХреНрд╢рди рд╕реЗ рдмрджрд▓ рджреЗрдЧрд╛ред

рд╕рд╛рде рд╣реА, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рд╕реЗ рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЕрд░реНрде рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ Greeter рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ newProperty рд╣реЛрдЧреА, рдЬреЛ рд╕рддреНрдп рдирд╣реАрдВ рд╣реИ:

function classDecorator<T extends {new(...args:any[]):{}}>(constructor:T) {
    return class extends constructor {
        newProperty = "new property";
        hello = "override";
    }
}

<strong i="13">@classDecorator</strong>
class Greeter {
    property = "property";
    hello: string;
    constructor(m: string) {
        this.hello = m;
    }
}

console.log(new Greeter("world"));

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЙрдЪрд┐рдд рд╣реИ рдХрд┐ рд▓реМрдЯрд╛ рд╡рд░реНрдЧ рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореВрд▓ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдореИрдВрдиреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдФрд░ рдРрд╕рд╛ рдХреЛрдИ рдЕрд╡рд╕рд░ рдирд╣реАрдВ рдорд┐рд▓рд╛ рдЬрд╣рд╛рдВ рд╡рд╣ рдХреЛрдб рдирдореВрдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реЛ ( рдЙрджрд╛рд╣рд░рдг 3.3.3 рд╕реЗ ) - рддреЛ рд╣рд╛рдБ, рдореИрдВ рд╕рд╣рдордд рд╣реВрдВред

рдореИрдВрдиреЗ https://github.com/microsoft/TypeScript-Website/issues/443 рдмрдирд╛рдпрд╛ рд╣реИ - рдЕрдЧрд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЙрд╕ рдХреНрд▓рд╛рд╕рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЪреМрд░рд╛рд╣реЗ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рддреЛ рдХреГрдкрдпрд╛ рдЙрд╕ рдореБрджреНрджреЗ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВ

рдореИрдВ рдпрд╣рд╛рдБ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдКрдкрд░ рд╕реВрдЪреАрдмрджреНрдз рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдиреЗ рдореБрдЭреЗ рднреНрд░рдорд┐рдд рдХрд░ рджрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕реЗ рд▓реМрдЯрд╛рдП рдЧрдП рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдЯреАрдПрд╕ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдорд╛рдиреНрдпрддрд╛ рджреА рдЧрдИ рдереА, рдЙрд╕ рдмрдбрд╝реЗ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрджрд▓реЗ рдореЗрдВ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП, рдпрд╣ @orta рдХреЗ рдкреАрдЖрд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдореИрдВ рдЬреЛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЙрд╕рдХрд╛ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:

interface HasNewProperty {
  newProperty: string;
}

function classDecorator<T extends { new (...args: any[]): {} }>(
  constructor: T
) {
  return class extends constructor implements HasNewProperty {
    newProperty = "new property";
    hello = "override";
  };
}

<strong i="8">@classDecorator</strong>
class Greeter {
  property = "property";
  hello: string;
  constructor(m: string) {
    this.hello = m;
  }
}

console.log(new Greeter("world"));

// Alas, this line makes the compiler angry because it doesn't know
// that Greeter now implements HasNewProperty
console.log(new Greeter("world").newProperty);
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

remojansen picture remojansen  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

MartynasZilinskas picture MartynasZilinskas  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dlaberge picture dlaberge  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zhuravlikjb picture zhuravlikjb  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kyasbal-1994 picture kyasbal-1994  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ