Typescript: рд╕реБрдЭрд╛рд╡: рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдЕрдореВрд░реНрдд рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 12 рдорд╛рд░реНрдЪ 2017  ┬╖  98рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: microsoft/TypeScript

рдирд┐рд░рдВрддрд░рддрд╛ #2947 рдЕрдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдЬреЛ рд╡рд┐рдзрд┐ рдШреЛрд╖рдгрд╛рдУрдВ рдкрд░ abstract рд╕рдВрд╢реЛрдзрдХ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛рдУрдВ рдкрд░ рдЗрд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рд╡рд┐рдзрд┐ рдШреЛрд╖рдгрд╛рдУрдВ рдкрд░ abstract static рд╕рдВрд╢реЛрдзрдХ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдХрд░ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛рдУрдВ рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВред .

рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╕реНрдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдкрд░ static рд╕рдВрд╢реЛрдзрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЬрд┐рд╕рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред

1. рд╕рдорд╕реНрдпрд╛

1.1. рдЕрдореВрд░реНрдд рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдЕрдореВрд░реНрдд рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпрд╛рдБ

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

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

abstract class AbstractParentClass {
}

class FirstChildClass extends AbstractParentClass {

    public static getSomeClassDependentValue(): string {
        return 'Some class-dependent value of class FirstChildClass';
    }
}

class SecondChildClass extends AbstractParentClass {

    public static getSomeClassDependentValue(): string {
        return 'Some class-dependent value of class SecondChildClass';
    }
}

FirstChildClass.getSomeClassDependentValue(); // returns 'Some class-dependent value of class FirstChildClass'
SecondChildClass.getSomeClassDependentValue(); // returns 'Some class-dependent value of class SecondChildClass'

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

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

abstract class AbstractParentClass {
}

class FirstChildClass extends AbstractParentClass {

    public static getSomeClassDependentValue(): string {
        return 'Some class-dependent value of class FirstChildClass';
    }
}

class SecondChildClass extends AbstractParentClass {

    public static getSomeClassDependentValue(): string {
        return 'Some class-dependent value of class SecondChildClass';
    }
}

abstract class AbstractParentClassFactory {

    public static getClasses(): (typeof AbstractParentClass)[] {
        return [
            FirstChildClass,
            SecondChildClass
        ];
    }
}

var classes = AbstractParentClassFactory.getClasses(); // returns some child classes (not objects) of AbstractParentClass

for (var index in classes) {
    if (classes.hasOwnProperty(index)) {
        classes[index].getSomeClassDependentValue(); // error: Property 'getSomeClassDependentValue' does not exist on type 'typeof AbstractParentClass'.
    }
}

рдирддреАрдЬрддрди, рд╕рдВрдХрд▓рдХ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рдФрд░ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ: рд╕рдВрдкрддреНрддрд┐ 'getSomeClassDependentValue' рдкреНрд░рдХрд╛рд░ 'рдЯрд╛рдЗрдкрдСрдлрд╝ рд╕рд╛рд░рдкреИрд░реЗрдВрдЯрдХреНрд▓рд╛рд╕' рдкрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред

1.2. рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╕реНрдерд┐рд░ рддрд░реАрдХреЗ

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

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

interface Serializable {
    serialize(): string;
    static deserialize(serializedValue: string): Serializable; // error: 'static' modifier cannot appear on a type member.
}

рдЗрд╕ рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ: 'рд╕реНрдерд┐рд░' рд╕рдВрд╢реЛрдзрдХ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рджрд╕реНрдп рдкрд░ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

2. рд╕рдорд╛рдзрд╛рди

рджреЛрдиреЛрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ (1.1 рдФрд░ 1.2) рдХрд╛ рд╕рдорд╛рдзрд╛рди рдЕрдореВрд░реНрдд рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдШреЛрд╖рдгрд╛рдУрдВ рдкрд░ abstract static рд╕рдВрд╢реЛрдзрдХ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИред

3. рдЬреЗрдПрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрдВрдЯрд░рдлреЗрд╕, рдЕрдореВрд░реНрдд рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐:

  1. рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдореЗрдВ рдЕрдореВрд░реНрдд рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдореЗрдВ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдкрд░ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред
  2. рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╣ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ)ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб (рдЙрджрд╛рд╣рд░рдг 4):

interface Serializable {
    serialize(): string;
    static deserialize(serializedValue: string): Serializable;
}

abstract class AbstractParentClass {
    public abstract static getSomeClassDependentValue(): string;
}

class FirstChildClass extends AbstractParentClass {

    public static getSomeClassDependentValue(): string {
        return 'Some class-dependent value of class FirstChildClass';
    }
}

class SecondChildClass extends AbstractParentClass implements Serializable {

    public serialize(): string {
        var serialisedValue: string;
        // serialization of this
        return serialisedValue;
    }

    public static deserialize(serializedValue: string): SecondChildClass {
        var instance = new SecondChildClass();
        // deserialization
        return instance;
    }

    public static getSomeClassDependentValue(): string {
        return 'Some class-dependent value of class SecondChildClass';
    }
}

рдЗрд╕ рдЬреЗрдПрд╕ рдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

var AbstractParentClass = (function () {
    function AbstractParentClass() {
    }
    return AbstractParentClass;
}());

var FirstChildClass = (function (_super) {
    __extends(FirstChildClass, _super);
    function FirstChildClass() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    FirstChildClass.getSomeClassDependentValue = function () {
        return 'Some class-dependent value of class FirstChildClass';
    };
    return FirstChildClass;
}(AbstractParentClass));

var SecondChildClass = (function (_super) {
    __extends(SecondChildClass, _super);
    function SecondChildClass() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    SecondChildClass.prototype.serialize = function () {
        var serialisedValue;
        // serialization of this
        return serialisedValue;
    };
    SecondChildClass.deserialize = function (serializedValue) {
        var instance = new SecondChildClass();
        // deserialization
        return instance;
    };
    SecondChildClass.getSomeClassDependentValue = function () {
        return 'Some class-dependent value of class SecondChildClass';
    };
    return SecondChildClass;
}(AbstractParentClass));

4. рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдмрд┐рдВрджреБ

  • рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдХреА рдПрдХ рдЕрдореВрд░реНрдд рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐ рдХреА рдШреЛрд╖рдгрд╛ рдХреЛ abstract static рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдХреА рдЕрдореВрд░реНрдд рд╕реНрдереИрддрд┐рдХ рдкрджреНрдзрддрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ abstract static рдпрд╛ static рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдХреА рдШреЛрд╖рдгрд╛ рдХреЛ static рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ static рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

abstract static рд╕рдВрд╢реЛрдзрдХ рдХреЗ рдЕрдиреНрдп рд╕рднреА рдЧреБрдг abstract рдФрд░ static рд╕рдВрд╢реЛрдзрдХ рдЧреБрдгреЛрдВ рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред

static рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рдЕрдиреНрдп рд╕рднреА рдЧреБрдг рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ static рд╕рдВрд╢реЛрдзрдХ рдЧреБрдгреЛрдВ рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред

5. рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛ рдЪреЗрдХрд▓рд┐рд╕реНрдЯ

  • рд╡рд╛рдХреНрдп-рд░рдЪрдирд╛ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░

    • _рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╡реНрдпрд╛рдХрд░рдг рдХреНрдпрд╛ рд╣реИ?_ - рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╡реНрдпрд╛рдХрд░рдг рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рдХрд╛ $#$2 abstract static static рд╕рдВрд╢реЛрдзрдХ рдФрд░ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ static рд╕рдВрд╢реЛрдзрдХ рд╣реИред

    • _рдХреНрдпрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмреИрдХ-рдХреЙрдореНрдкреЗрдЯ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдХрдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?_ - рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмреИрдХ-рдХрдВрдкреИрдЯ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реИред

    • _рдХреНрдпрд╛ рдпрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ ES6 рдпрд╛ рдкреНрд░рд╢рдВрд╕рдиреАрдп ES7 рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рддрд╛ рд╣реИ?_ - рдпрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ ES6 рдпрд╛ рдкреНрд░рд╢рдВрд╕рдиреАрдп ES7 рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

  • рд╕рд┐рдореЗрдВрдЯрд┐рдХ

    • _рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рддрд╣рдд рддреНрд░реБрдЯрд┐ рдХреНрдпрд╛ рд╣реИ?_ - рдЕрдм рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рдХреЗ $#$4 abstract static static рд╕рдВрд╢реЛрдзрдХ рдФрд░ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ static рд╕рдВрд╢реЛрдзрдХ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВред

    • _рд╕реБрд╡рд┐рдзрд╛ рдЙрдк-рдкреНрд░рдХрд╛рд░, рд╕реБрдкрд░рдЯрд╛рдЗрдк, рдкрд╣рдЪрд╛рди, рдФрд░ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдпрддрд╛ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИ?_ - рд╕реБрд╡рд┐рдзрд╛ рдЙрдк-рдкреНрд░рдХрд╛рд░, рд╕реБрдкрд░рдЯрд╛рдЗрдк, рдкрд╣рдЪрд╛рди рдФрд░ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдпрддрд╛ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреА рд╣реИред

    • _рд╕реБрд╡рд┐рдзрд╛ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддреА рд╣реИ?_ - рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред

  • рдлреЗрдВрдХрдирд╛

    • _рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрддреНрд╕рд░реНрдЬрди рдкрд░ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдХреНрдпрд╛ рдкреНрд░рднрд╛рд╡ рд╣реИрдВ?_ - рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрддреНрд╕рд░реНрдЬрди рдкрд░ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реИред

    • _рдХреНрдпрд╛ рдпрд╣ 'рдХрд┐рд╕реА' рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░реЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рд╣реЛрддрд╛ рд╣реИ?_ - рд╣рд╛рдБред

    • _рдШреЛрд╖рдгрд╛ рдлрд╝рд╛рдЗрд▓ (.d.ts) рдХреЗ рдЙрддреНрд╕рд░реНрдЬрди рдкрд░ рдХреНрдпрд╛ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддреЗ рд╣реИрдВ?_ - рдШреЛрд╖рдгрд╛ рдлрд╝рд╛рдЗрд▓ рдкрд░ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИред

    • _рдХреНрдпрд╛ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдмрд╛рд╣рд░реА рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЪрд▓рддреА рд╣реИ?_ - рд╣рд╛рдБред

  • рдЕрдиреБрдХреВрд▓рддрд╛

    • _рдХреНрдпрд╛ рдпрд╣ 1.0 рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реЗ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрджрд▓рд╛рд╡ рд╣реИ?_ - рд╢рд╛рдпрдж рд╣рд╛рдВ, 1.0 рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

    • _рдХреНрдпрд╛ рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ?_ - рдирд╣реАрдВред

    • _рдХреНрдпрд╛ рдпрд╣ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдпрд╛рдиреА ES6/ES7/рдмрд╛рдж рдХреЗ) рдлреАрдЪрд░ рдХрд╛ рдЕрд╕рдВрдЧрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ?_ - рдирд╣реАрдВред

  • рдЕрдиреНрдп

    • _рдХреНрдпрд╛ рд╕рдВрдХрд▓рдХ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдирдХрд╛рд░рд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?_ - рд╢рд╛рдпрдж рд╣рд╛рдБред

    • _рдЗрд╕рдХрд╛ рдЯреВрд▓рд┐рдВрдЧ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдкрд░ рдХреНрдпрд╛ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рд╕рджрд╕реНрдп рдкреВрд░рд╛ рдХрд░рдирд╛ рдФрд░ рд╕рдВрдкрд╛рджрдХреЛрдВ рдореЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕рд╣рд╛рдпрддрд╛?_ - рд╢рд╛рдпрдж рдЗрд╕рдХрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИред

Awaiting More Feedback Suggestion

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

abstract class Serializable {  
    abstract serialize (): Object;  
    abstract static deserialize (Object): Serializable;  
}  

рдореИрдВ Serializable рдХреЗ рдЙрдкрд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реНрдереИрддрд┐рдХ deserialize рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрд╛рдзреНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред
рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реИ?

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

рд╕реНрдЯреЗрдЯрд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЖрдо рддреМрд░ рдкрд░ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддреА рд╣реИрдВ, #13462 рджреЗрдЦреЗрдВ

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

рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╕рдордп рд╣рдорд╛рд░реЗ рдорди рдореЗрдВ рдПрдХ рдкреНрд░рдореБрдЦ рдкреНрд░рд╢реНрди рдерд╛: abstract static рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдХрд┐рд╕реЗ рд╣реИ? рд╕рдВрднрд╡рддрдГ рдЖрдк рд╕реАрдзреЗ AbstractParentClass.getSomeClassDependentValue рдЖрд╣реНрд╡рд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдк AbstractParentClass рдкреНрд░рдХрд╛рд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рдХреНрдпреЛрдВ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рд╣реИ?

рд╕реНрдЯреЗрдЯрд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЖрдо рддреМрд░ рдкрд░ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддреА рд╣реИрдВ, #13462 рджреЗрдЦреЗрдВ

#13462 рдХреА рдЪрд░реНрдЪрд╛ рдореЗрдВ рдореИрдВрдиреЗ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрд╛ рдХрд┐ static рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рддрд░реАрдХреЗ рдмреЗрд╣реВрджрд╛ рдХреНрдпреЛрдВ рд╣реИрдВред рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдпрд╣ рджреЗрдЦрд╛ рдХрд┐ рдЙрдирдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЕрдиреНрдп рдорд╛рдзреНрдпрдореЛрдВ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬреЛ рд╕рд╛рдмрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╕рдВрд╡реЗрджрдирд╣реАрди рдирд╣реАрдВ рд╣реИрдВ)ред

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

рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдХреЛрдИ рддрд╛рд░реНрдХрд┐рдХ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рдХрд┐ class рдореЗрдВ static рд╡рд┐рдзрд┐ рдХреНрдпреЛрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ interface рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИред

рдпрджрд┐ рд╣рдо рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ рдХрд┐ рднрд╛рд╖рд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд▓рд╛рдЧреВ рдХреА рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реА рд╣рд░ рдЪреАрдЬ рдХреЛ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рдХрд┐рд╕реА рднреА рд╕реБрдзрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдЕрд░реНрдерд╛рддреН, рдпрд╣ рддрд░реНрдХ #13462 рдХреА рдЪрд░реНрдЪрд╛ рдореЗрдВ рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдерд╛), рддреЛ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рд╣рдо рдпрд╣ рддрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ while рдЪрдХреНрд░ рдирд┐рд░рд░реНрдердХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ for рдФрд░ if рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо while рдХреЛ рдЦрддреНрдо рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред

рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╕рдордп рд╣рдорд╛рд░реЗ рдорди рдореЗрдВ рдПрдХ рдкреНрд░рдореБрдЦ рдкреНрд░рд╢реНрди рдерд╛: abstract static рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдХрд┐рд╕реЗ рд╣реИ? рд╕рдВрднрд╡рддрдГ рдЖрдк рд╕реАрдзреЗ AbstractParentClass.getSomeClassDependentValue рдЖрд╣реНрд╡рд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдк AbstractParentClass рдкреНрд░рдХрд╛рд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рдХреНрдпреЛрдВ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рд╣реИ?

рдЕрдЪреНрдЫрд╛ рдкреНрд░рд╢реНрдиред рдЪреВрдВрдХрд┐ рдЖрдк рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рдереЗ, рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

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

рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдпрд╣ рджреЗрдЦрд╛ рдХрд┐ рдЙрдирдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЕрдиреНрдп рдорд╛рдзреНрдпрдореЛрдВ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬреЛ рд╕рд╛рдмрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╕рдВрд╡реЗрджрдирд╣реАрди рдирд╣реАрдВ рд╣реИрдВ)ред

рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдХреБрдЫ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдореИрдВ

abstract class Serializable {  
    abstract serialize (): Object;  
    abstract static deserialize (Object): Serializable;  
}  

рдореИрдВ Serializable рдХреЗ рдЙрдкрд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реНрдереИрддрд┐рдХ deserialize рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрд╛рдзреНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред
рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реИ?

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

рдХреНрдпрд╛ @patryk-zielinski93 рдиреЗ рдХрд╣рд╛ред PHP рдореЗрдВ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рд╕реЗ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рд╣рдо рдЯреАрдПрд╕ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╕реНрдерд┐рд░ рддрд░реАрдХреЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдорджрдж рдХрд░реЗрдЧрд╛ рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХ, рдЬреЛ рд╕реНрдерд┐рд░ рдЧреБрдгреЛрдВ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ displayName , propTypes , рдФрд░ defaultProps ред

рдЗрд╕ рд╕реАрдорд╛ рдХреЗ рдХрд╛рд░рдг, рд░рд┐рдПрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд┐рдВрдЧ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рджреЛ рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: рдПрдХ Component рд╡рд░реНрдЧ, рдФрд░ ComponentClass рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬрд┐рд╕рдореЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рд╕реНрдерд┐рд░ рдЧреБрдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХ рдХреЛ рдЙрд╕рдХреЗ рд╕рднреА рд╕реНрдерд┐рд░ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдХреЗ рдкрд╛рд╕ рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рджреЛ рдЙрдкрдпреЛрдЧ рд╣реЛрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдмрд┐рдирд╛ ComponentClass : рд╕реНрдерд┐рд░ рдЧреБрдгреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

import React, { Component, ComponentClass } from 'react';

type Props = { name: string };

{
  class ReactComponent extends Component<Props, any> {
    // expected error, but got none: displayName should be a string
    static displayName = 1
    // expected error, but got none: defaultProps.name should be a string
    static defaultProps = { name: 1 }
  };
}

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде ComponentClass : рд╕реНрдереИрддрд┐рдХ рдЧреБрдгреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ

{
  // error: displayName should be a string
  // error: defaultProps.name should be a string
  const ReactComponent: ComponentClass<Props> = class extends Component<Props, any> {
    static displayName = 1
    static defaultProps = { name: 1 }
  };
}

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

рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╕реНрдпрд╛: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/16967

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

abstract class Model {
    abstract static fromString(value: string): Model
}

class Animal extends Model {
    constructor(public name: string, public weight: number) {}

    static fromString(value: string): Animal {
        return new Animal(...JSON.parse(value))
    }
}

@roboslone

class Animal {
    static fromString(value: string): Animal {
        return new Animal();
    }
}

function useModel<T>(model: { fromString(value: string): T }): T {
    return model.fromString("");
}

useModel(Animal); // Works!

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

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

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

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

рдПрдХ рдФрд░ рд╕рд░рд▓ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛: (рдЖрджрд░реНрд╢ рддрд░реАрдХрд╛, рдЬреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)

import {map} from 'lodash';

export abstract class BaseListModel {
  abstract static get instance_type();

  items: any[];

  constructor(items?: any[]) {
    this.items = map(items, (item) => { return new this.constructor.instance_type(item) });
  }

  get length() { return this.items.length; }
}

export class QuestionList extends BaseListModel {
  static get instance_type() { return Question }
}

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

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

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

class Action {
  constructor(public type='') {}
}

class AddAppleAction extends Action {
  static create(apple: Apple) {
    return new this(apple);
  }
  constructor(public apple: Apple) {
    super('add/apple');
  }
}

class AddPearAction extends Action {
  static create(pear: Pear) {
    return new this(pear);
  }

  constructor(public pear: Pear) {
    super('add/pear');
  }
}

const ActionCreators = {
  addApple: AddAppleAction
  addPear: AddPearAction
};

const getActionCreators = <T extends Action>(map: { [key: string]: T }) => {
  return Object.entries(map).reduce((creators, [key, ActionClass]) => ({
    ...creators,
    // To have this function run properly,
    // I need to guarantee that each ActionClass (subclass of Action) has a static create method defined.
    // This is where I want to use abstract class or interface to enforce this logic.
    // I have some work around to achieve this by using interface and class decorator, but it feels tricky and buggy. A native support for abstract class method would be really helpful here.
    [key]: ActionClass.create.bind(ActionClass)
  }), {});
};

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рджред

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

class myClass {
    public classProp: string;
}

interface myConstructor {
    new(): myClass;

    public readonly staticProp: string;
}

function StaticImplements <T>() {
    return (constructor: T) => { };
}

<strong i="7">@StaticImplements</strong> <myConstructor>()
class myClass implements myClass {}
const getActionCreators = <T extends Action>(map: { [key: string]: {new () => T, create() : T}}) => {

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

рдореИрдВ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдЬреЛ рдирд╣реАрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдХреБрдЫ рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рдкрд░реАрдд рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ рдХрд┐, рд╕реА # рдЬреИрд╕реА рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрд╣рд╛рдВ abstract рд╕рджрд╕реНрдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреНрд╡рд╛рд░рд╛ _рдУрд╡рд░рд░рд╛рдЗрдбреЗрдб_ рд╣реИрдВ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЙрджрд╛рд╣рд░рдг рдпрд╛ рдЕрдиреНрдпрдерд╛, рдХрднреА рднреА рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ _shadow_ рдЙрдиреНрд╣реЗрдВред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдореЗрд░рд╛ 5 рд╕реЗрдВрдЯ рдпрд╣рд╛рдБ рд╣реИ:

рдЗрдВрдЯрд░рдлреЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ _static_ рд╕рдВрд╢реЛрдзрдХ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП

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

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

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдпрд╣ рдЧрд▓рдд рдФрд░ рдмрд╛рдзрдХ рд▓рдЧрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдХреЛрдИ рддрдХрдиреАрдХреА рдкреГрд╖реНрдарднреВрдорд┐ рд╣реИ рдЬреЛ рдЗрд╕ рднрд╛рд╖рд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрдард┐рди рдпрд╛ рдЕрд╕рдВрднрд╡ рдмрдирд╛ рд░рд╣реА рд╣реИ?

рдЪрд┐рдпрд░реНрд╕

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

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

рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░, рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВред

рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдмрддрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ? рдпрд╣ рд╕реА # рдирд╣реАрдВ рд╣реИ

рд╡реЗ рдХреЗрд╡рд▓ рд╡рд░реНрдЧ/рдирд┐рд░реНрдорд╛рддрд╛ рд╕рдорд╛рд░реЛрд╣ рдкрд░ рдореМрдЬреВрдж рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХрд┐ рд╣рдореЗрдВ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣реА рд╣рдо рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

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

рдореИрдВ рдЙрд╕ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рд╣реВрдВред Json рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ

рд╣рд╛рдп @kitsonk , рдХреГрдкрдпрд╛ рдЖрдк рдЗрд╕ рдкрд░ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рджреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ, рджреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдиреБрдмрдВрдз рд╣реИрдВ, рдФрд░ рдЗрд╕рд╕реЗ рджреВрд░ рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдореБрдЭреЗ рд╡рд╣ рд╣рд┐рд╕реНрд╕рд╛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ред

рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ, рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рддрд╣ рд╣реИрдВред рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рддрд╣ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╡рд╣рд╛рдВ рдирд╣реАрдВ рд╣реИред

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

рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░, рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВред рд╡реЗ рдХреЗрд╡рд▓ рд╡рд░реНрдЧ/рдирд┐рд░реНрдорд╛рддрд╛ рд╕рдорд╛рд░реЛрд╣ рдкрд░ рдореМрдЬреВрдж рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

fetchData(account: SalesRepresentativeInterface): Observable<Array<AccountModel>> {
    // Method Body
}

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ static рд╕рдВрд╢реЛрдзрдХ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╕реЗ рдореБрдЭреЗ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓реЗрдЧреА: SalesRepresentativeInterface.staticMethodCall()

рдХреНрдпрд╛ рдореИ рдЧрд▓рдд рд╣реБ ?

рдЪрд┐рдпрд░реНрд╕

@davidmpaz : рдЖрдкрдХрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд░реАрдм рд╣реИред рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЙрдкрдпреЛрдЧ рдкреИрдЯрд░реНрди рд╣реИ:

interface JSONSerializable {
  static fromJSON(json: any): JSONSerializable;
  toJSON(): any;
}

function makeInstance<T extends JSONSerializable>(cls: typeof T): T {
  return cls.fromJSON({});
}

class ImplementsJSONSerializable implements JSONSerializable {
  constructor(private json: any) {
  }
  static fromJSON(json: any): ImplementsJSONSerializable {
    return new ImplementsJSONSerializable(json);
  }
  toJSON(): any {
    return this.json;
  }
}

// returns an instance of ImplementsJSONSerializable
makeInstance(ImplementsJSONSerializable);

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рджреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: (1) рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рдФрд░ рдЕрдореВрд░реНрдд рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐рдпрд╛рдБ; (2) рдЬреЗрдиреЗрд░рд┐рдХ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ typeof рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред

@davidmpaz

рдореБрдЭреЗ рд╡рд╣ рд╣рд┐рд╕реНрд╕рд╛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ред

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

interface Foo {
  bar(): void;
}

interface FooConstructor {
  new (): Foo;
  prototype: Foo;
  baz(): void;
}

declare const Foo: FooConstructor;

const foo = new Foo();
foo.bar();  // instance method
Foo.baz(); // static method

@jimmykane

рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдмрддрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ? рдпрд╣ рд╕реА # рдирд╣реАрдВ рд╣реИ

class Foo {
    bar() {}
    static baz() {}
}

const foo = new Foo();

foo.bar();
Foo.baz();

Foo рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдХреЛрдИ .baz() Foo рдирд╣реАрдВ рд╣реИред .baz() рдХреЗрд╡рд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкрд░ рдореМрдЬреВрдж рд╣реИред

рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╕реЗ, рдЖрдк рдЗрди рджреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд/рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред Foo рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ typeof Foo рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЬрд┐рд╕рдореЗрдВ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреА)ред

@kitsonk рдХреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ:

interface JSONSerializable <T>{
    fromJSON(json: any): T;
}

function makeInstance<T>(cls: JSONSerializable<T>): T {
    return cls.fromJSON({});
}

class ImplementsJSONSerializable {
    constructor (private json: any) {
    }
    static fromJSON(json: any): ImplementsJSONSerializable {
        return new ImplementsJSONSerializable(json);
    }
    toJSON(): any {
        return this.json;
    }
}

// returns an instance of ImplementsJSONSerializable
makeInstance(ImplementsJSONSerializable); 

рдпрд╣рд╛рдВ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐:

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

@mhegazy : рдЖрдкрдХреЛ JSONSerializable рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдореЗрд░реА toJSON рдХреЙрд▓ рдХреЛ рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЗрд░рд╛ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдлрд╝рдВрдХреНрд╢рди makeInstance рдХреЗрд╡рд▓ fromJSON рдкрд░ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рддреБрд░рдВрдд рдЪрд╛рд▓реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрдо рд╣реИред рдЖрдкрдиреЗ makeInstance рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдореЗрд░реА рдХреНрд╖рдорддрд╛ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ T makeInstance рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдпрджрд┐ makeInstance рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдПрдХ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рд╣реИ, рдлрд┐рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)ред рдмреЗрд╢рдХ рдореИрдВ рдпрд╣ рдХрд░ рд╕рдХрддрд╛ рдерд╛:

interface JSONSerializer {
  toJSON(): any;
}

interface JSONSerializable <T extends JSONSerializer> {
  fromJSON(json: any): T;
}

function makeInstance<T extends JSONSerializer>(cls: JSONSerializable<T>): T {
  return cls.fromJSON({});
}

class ImplementsJSONSerializer implements JSONSerializer {
  constructor (private json: any) {
  }
  static fromJSON(json: any): ImplementsJSONSerializer {
    return new ImplementsJSONSerializer(json);
  }
  toJSON(): any {
    return this.json;
  }
}

// returns an instance of ImplementsJSONSerializable
makeInstance(ImplementsJSONSerializer);

рдФрд░ рдЕрдм рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ T рдореЗрдВ рд╕рднреА рддрд░реАрдХреЗ рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗ JSONSerializer ред рд▓реЗрдХрд┐рди рдпрд╣ рдЕрддреНрдпрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдФрд░ рддрд░реНрдХ рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рди рд╣реИ (рд░реБрдХреЛ, рдЖрдк ImplementsJSONSerializer рдкрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ JSONSerializable рдирд╣реАрдВ рд╣реИ, рд╣реИ рдирд╛? рд░реБрдХреЛ, рдЖрдк рдбрдХ-рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ ??) . рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрд╕рд╛рди рдХрд╛рд░рдг рд╣реИ:

interface JSONSerializer {
  toJSON(): any;
}

interface JSONSerializable <T extends JSONSerializer> {
  fromJSON(json: any): T;
}

function makeInstance<T extends JSONSerializer>(cls: JSONSerializable<T>): T {
  return cls.fromJSON({});
}

class ImplementsJSONSerializer implements JSONSerializer {
  constructor (private json: any) {
  }
  toJSON(): any {
    return this.json;
  }
}

class ImplementsJSONSerializable implements JSONSerializable<ImplementsJSONSerializer> {
  fromJSON(json: any): ImplementsJSONSerializer {
    return new ImplementsJSONSerializer(json);
  }

}

// returns an instance of ImplementsJSONSerializable
makeInstance(new ImplementsJSONSerializable());

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

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

рддреЛ рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╡рд░реНрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реНрдерд┐рд░ fromJSON рд╣реЛ рдФрд░ рдЬрд┐рдирдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ toJSON рд╣реЛ:

interface JSONSerializer {
    toJSON(): any;
}

interface JSONSerializable<T extends JSONSerializer> {
    fromJSON(json: any): T;
}

function makeInstance<T extends JSONSerializer>(cls: JSONSerializable<T>): T {
    return cls.fromJSON({});
}

class ImplementsJSONSerializer {
    constructor (private json: any) {
    }
    static fromJSON(json: any): ImplementsJSONSerializer {
        return new ImplementsJSONSerializer(json);
    }
    toJSON(): any {
        return this.json;
    }
}


// returns an instance of ImplementsJSONSerializable
makeInstance(ImplementsJSONSerializer);

@mhegazy рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдмрддрд╛рдпрд╛ рдХрд┐ рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВред рдореЗрд░рд╛ рдкрд╣рд▓рд╛ 'рдмрддрдЦ-рдЯрд╛рдЗрдкрд┐рдВрдЧ' рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред рдореИрдВрдиреЗ рддрд░реНрдХ рджрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИред рдореИрдВрдиреЗ рддрдм рдЬреЛрд░ рджреЗрдХрд░ рдХрд╣рд╛ рдХрд┐ рдЬрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ (рдХрд╛рд░рдЦрд╛рдирд╛ рд╡рд░реНрдЧ) рдФрд░ рднреА рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╣реИред

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

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

рдореИрдВрдиреЗ рддрдм рдЬреЛрд░ рджреЗрдХрд░ рдХрд╣рд╛ рдХрд┐ рдЬрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ (рдХрд╛рд░рдЦрд╛рдирд╛ рд╡рд░реНрдЧ)

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

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

рдФрд░ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЗрд╕реЗ рдЬреЛрдбрд╝реЗ рдЬрд╛рдиреЗ рдкрд░ рдирдЬрд╝рд░ рд░рдЦ рд░рд╣реА рд╣реИред рдореИрдВ рдмрд╕ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЗрд╕ рдереНрд░реЗрдб рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЖрдЧрдВрддреБрдХ рдпрд╣ рд╕рдордЭреЗрдВ рдХрд┐ рдпрд╣ рдЖрдЬ implements рдХреНрд▓реЙрдЬ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрднрд╡ рд╣реИред

@kitsonk рдареАрдХ рд╣реИ рдореБрдЭреЗ рд╡рд╣ рдпрд╛рдж рдЖрдпрд╛ред

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

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

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

рдпрд╣рд╛рдВ:

export interface LocationModuleInterface {
  readonly name: string;

  getRecreationOptions(): ModuleRecreationOptions;
}

export abstract class AbstractLocationModule implements LocationModuleInterface {
  abstract readonly name: string;

  abstract getRecreationOptions(): ModuleRecreationOptions;

  abstract static recreateFromOptions(options: ModuleRecreationOptions): AbstractLocationModule;
}

рдФрд░ рдлрд┐рд░ рдореИрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдареЛрдХрд░ рдЦрд╛рддрд╛ рд╣реВрдВ, рд╕реНрдерд┐рд░ рд╕рд╛рд░ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред рдФрд░ рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред

рджреЛрд╕реНрддреЛрдВ, рдЧрдВрднреАрд░рддрд╛ рд╕реЗ, рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рд░рдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

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

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

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

рдореЗрд░реЗ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рд░рдирдЯрд╛рдЗрдо рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рд╣реЛрдЧреАред рд╡рд╣ рднреА рдХреИрд╕реЗ?

рдпрд╛ рдЗрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░:

export interface LocationModuleInterface {
  readonly name: string;

  getRecreationOptions(): ModuleRecreationOptions;
  dontForgetToHaveStaticMethodForRecreation();
}

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

@рдорд╛рд▓рд┐рдирд╛-рдХрд┐рд░реНрди

рдореЗрд░рд╛ рдкрд╣рд▓рд╛ 'рдмрддрдЦ-рдЯрд╛рдЗрдкрд┐рдВрдЧ' рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред

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

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

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

interface IComponent<TProps> {
    render(): JSX.Element;
}

type ComponentStaticDisplayName = 'One' | 'Two' | 'Three' | 'Four';
interface IComponentStatic<TProps> {
    defaultProps?: Partial<TProps>;
    displayName: ComponentStaticDisplayName;
    hasBeenValidated: 'Yes' | 'No';
    isFlammable: 'Yes' | 'No';
    isRadioactive: 'Yes' | 'No';
    willGoBoom: 'Yes' | 'No';
}

interface IComponentClass<TProps> extends IComponentStatic<TProps> {
    new (): IComponent<TProps> & IComponentStatic<TProps>;
}

function validateComponentStaticAtRuntime<TProps>(ComponentStatic: IComponentStatic<TProps>, values: any): void {
    if(ComponentStatic.isFlammable === 'Yes') {
        // something
    } else if(ComponentStatic.isFlammable === 'No') {
        // something else
    }
}

// This works, we've explicitly described the object using an interface
const componentStaticInstance: IComponentStatic<any> = {
    displayName: 'One',
    hasBeenValidated: 'No',
    isFlammable: 'Yes',
    isRadioactive: 'No',
    willGoBoom: 'Yes'
};

// Also works
validateComponentStaticAtRuntime(componentStaticInstance, {});

class ExampleComponent1 implements IComponent<any> {
    public render(): JSX.Element { return null; }

    public static displayName = 'One'; // inferred as type string
    public static hasBeenValidated = 'No'; // ditto ...
    public static isFlammable = 'Yes';
    public static isRadioactive = 'No';
    public static willGoBoom = 'Yes';
}

// Error: " ... not assignable to type IComponentStatic<..> ... "
validateComponentStaticAtRuntime(ExampleComponent1, {});

class ExampleComponent2 implements IComponent<any> {
    public render(): JSX.Element { return null; }

    public static displayName = 'One';
    public static hasBeenValidated = 'No';
    public static isFlammable = 'Yes';
    public static isRadioactive = 'No';
    public static willGoBoom = 'Yes';
}

// Error: " ... not assignable to type IComponentStatic<..> ... "
validateComponentStaticAtRuntime(ExampleComponent2, {});

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

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

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

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

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

рдЕрдиреНрдп рдкреЛрд╕реНрдЯ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕рд╛рдЗрдЯ рдкрд░ рдЪреЗрдХ рдХреЛ рдЖрдХрд╛рд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП #workarounds рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпреЗ рдЦрддрд░рдирд╛рдХ рд╕рдорд╛рдзрд╛рди рдЖрдкрдХреЛ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реНрдерд▓ рдкрд░ рдЖрдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗ (рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ), рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:

  • рд╡реЗ рдКрдкрд░ рдирдВрдмрд░ 1 рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рднреА рдЖрдкрдХреЛ рд╣рд░ рд╡рд░реНрдЧ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕рджрд╕реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
  • рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдирдореЗрдВ рд╕реНрдкрд╖реНрдЯрддрд╛, рд▓рд╛рд▓рд┐рддреНрдп рдФрд░ рдкрдардиреАрдпрддрд╛ рдХрд╛ рдЕрднрд╛рд╡ рд╣реЛрддрд╛ рд╣реИред рд╡реЗ рд╣рдореЗрд╢рд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рд╕рд╣рдЬ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдХрд╛рдлреА рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╕рдВрднрд╡ рд╣реИрдВред
  • рд╡реЗ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ #workaroundsToMakeTheWorkaroundsWork рдЦреЛрдЬрдирд╛ рдордЬрд╝реЗрджрд╛рд░ рдпрд╛ рдЙрддреНрдкрд╛рджрдХ рдирд╣реАрдВ рд╣реИ... рд▓реЗрдХрд┐рди рдЬрд╝реНрдпрд╛рджрд╛рддрд░ рдордЬрд╝реЗрджрд╛рд░ рдирд╣реАрдВ рд╣реИред

рдпрд╣рд╛рдБ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реНрдерд▓ рдкрд░ рдЖрдХрд╛рд░ рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрдЦрд╛ рд╣реИ ...

// (at least) two separate interfaces
interface ISomeComponent { ... }
interface ISomeComponentClass { ... }

// confusing workaround with extra work to use, not very intuitive, etc
export const SomeComponent: ISomeComponentClass =
class SomeComponent extends Component<IProps, IState> implements ISomeComponent {
...
}

рдЕрдм рдЙрд╕ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдлреЗрдВрдХрд╛ рдЧрдпрд╛ рд╣реЛ

interface ISomeComponent { ... }
// need to separate the static type from the class type, because the abstract class won't satisfy
// the shape check for new(): ... 
interface ISomeComponentStatic { ... }
interface ISomeComponentClass { 
    new (): ISomeComponent & ISomeComponentStatic;
}

// I AM ERROR.    ... cannot find name abstract
export const SomeComponentBase: ISomeComponentStatic =
abstract class SomeComponentBase extends Component<IProps, IState> implements ISomeComponent {
...
}

export const SomeComponent: ISomeComponentClass =
class extends SomeComponentBase { ... }

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЙрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рднреА рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ... рдЖрд╣

...

abstract class SomeComponentBaseClass extends Component<IProps, IState> implements ISomeComponent { 
   ... 
}

// Not as nice since we're now below the actual definition site and it's a little more verbose
// but hey at least were in the same module and we can check the shape if the use site is in
// external code...
// We now have to decide if we'll use this work around for all classes or only the abstract ones
// and instead mix and match workaround syntax
export const SomeComponentBase: ISomeComponentStatic = SomeComponentBaseClass;

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

interface IComponent<TProps extends A> { ... }
interface IComponentStatic<TProps extends A> { ... }

interface IComponentClass<TProps extends A, TOptions extends B> extends IComponentStatic<TProps> {
    new (options: TOptions): IComponent<TProps> & IComponentStatic<TProps>;
}

abstract class SomeComponentBaseClass<TProps extends A, TOptions extends B> extends Component<TProps, IState> implements IComponent<TProps> {
...
}

// Ruh Roh Raggy: "Generic type .... requires 2 type argument(s) ..."
export const SomeComponentBase: IComponentStatic = SomeComponentBaseClass;


// "....  requires 1 type argument(s) ... "    OH NO, We need a different workaround
export const SomeComponent: IComponentStatic =
class extends SomeComponentBase<TProps extends A, ISomeComponentOptions> {
...
}

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

рдпрджрд┐ рдЖрдк рд╕рд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рд╕рдореБрджрд╛рдп/рдЕрдиреБрд░рдХреНрд╖рдХреЛрдВ рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП static рд╕рдВрд╢реЛрдзрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рд░реВрдк рд╕реЗ рдордирд╛рдПрдВред рдФрд░ рдЗрд╕ рдмреАрдЪ рдЖрдкрдХреЛ рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕рд╛рдЗрдЯ рдкрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП #8328 рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред 16 рдордИ 2016 рдХреЛ @RyanCavanaugh . рдХреЗ рд╕реМрдЬрдиреНрдп рд╕реЗ @mhegazy рдХреА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд╕рдорд╛рдзрд╛рди рджреЗрдЦреЗрдВ

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

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

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

рдпрд╣ Java рд╕реЗ C# рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИред рдЬрдм рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ C# рдХреЛрдб рдХреЛ рдРрд╕рд╛ рдХрд░рддреЗ рджреЗрдЦрд╛ рдерд╛
C# var something = "something"; if(something == "something") { ... }
рдореЗрд░реЗ рд╕рд┐рд░ рдореЗрдВ рдЦрддрд░реЗ рдХреА рдШрдВрдЯреА рдмрдЬрдиреЗ рд▓рдЧреА, рджреБрдирд┐рдпрд╛ рдЦрддреНрдо рд╣реЛ рд░рд╣реА рдереА, рдЙрдиреНрд╣реЗрдВ "something".Equals(something) рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА

== рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдмрд░рд╛рдмрд░ рд╣реИ! рд╕реНрдЯреНрд░рд┐рдВрдЧ рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрд▓рдЧ .Equals(...) рд╣реИ...
рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рдХреЛ рдкрд╣рд▓реЗ рдЖрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рддрд╛рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рд╢реВрдиреНрдп рд░реЗрдлрд░реА рдХреЙрд▓рд┐рдВрдЧ рди рдорд┐рд▓реЗред рдПрдХ рд╢реВрдиреНрдп рдЪрд░ рдкрд░ рдмрд░рд╛рдмрд░ (...) ...
рдФрд░... рдФрд░... рд╣рд╛рдЗрдкрд░рд╡реЗрдВрдЯреАрд▓реЗрдЯрд┐рдВрдЧ

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

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

рдореИрдВ рдЕрдЧрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ abstract static рдкрд░ рдзреНрдпрд╛рди рджреВрдВрдЧрд╛....

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

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

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

рддреЛ abstract static ... рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВред рдмрд╣реБрдд рд╕рд╛рд░реА рд╕рдорд╕реНрдпрд╛рдПрдВред

рдЖрдкрдХреЛ рдпрд╣ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдФрд░ рдЬрдЯрд┐рд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рдЙрдкрдпреЛрдЧ рд╕рд╛рдЗрдЯ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреНрдпрд╛ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рдПрдЧрд╛ (рдпрджрд┐ рдЙрдкрдпреЛрдЧ рд╕рд╛рдЗрдЯ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдЪреЗрдХ рдХреА рдЬрд╛рдПрдЧреА)ред

рдпрджрд┐ рдЙрдкрдпреЛрдЧ рд╕рд╛рдЗрдЯ рдмрд╛рд╣рд░реА рд╣реИ рддреЛ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ static рд╕рджрд╕реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ... рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдкреНрд▓рдЧрд┐рдВрдЧ ... рдФрд░ рд╢реБрдн рд░рд╛рддреНрд░рд┐!

@aluanhaddad рд╕рдЪ рд╣реИ, рд▓реЗрдХрд┐рди рднрд▓реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕рджрд╕реНрдп рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рдПрдХ рд╕рдорд░реНрдерд┐рдд рд╕реБрд╡рд┐рдзрд╛ рдереА, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдХреНрд╖рд╛ рдХреЗ рд╕реНрдерд┐рд░ рдкрдХреНрд╖ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдп рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕реНрд╡рдЪреНрдЫ рддрд░реАрдХреЛрдВ рдХреА рдХрдореА рд╣реИред

рдЬрд┐рд╕ рдмрд┐рдВрджреБ рдХреЛ рдореИрдВ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рд╡рд╣ рдпрд╣ рдерд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ explicitly рд╡рд░реНрдЧ рдХреЗ рд╕реНрдерд┐рд░ рдкрдХреНрд╖ рдХреА рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕рдВрд░рдЪрдирд╛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рдХрдореА рд╣реИ рдФрд░ рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдпрд╣ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ (рдпрд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ)

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

рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдЕрдиреБрдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдХреНрдпреЛрдВ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред
рдпрд╣рд╛рдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдХреЗ let something: ISomethingStatic = { isFlammable: 'Ys', isFlammable2: 'No' ... isFlammable100: 'No' } рд╣рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ 'рд╣рд╛рдВ' рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ | 'рдирд╣реАрдВ' 100 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрд╛рд░ред

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

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

рдХреБрдЫ рд╡рд╛рдЪрд╛рд▓рддрд╛ рдХреА рдХреАрдордд рдкрд░, рдЖрдк рдПрдХ рд╕рднреНрдп рд╕реНрддрд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

type HasType<T, Q extends T> = Q;

interface IStatic<X, Y> {
    doWork: (input: X) => Y
}

type A_implments_IStatic<X, Y> = HasType<IStatic<X, Y>, typeof A>    // OK
type A_implments_IStatic2<X> = HasType<IStatic<X, number>, typeof A> // OK
type A_implments_IStatic3<X> = HasType<IStatic<number, X>, typeof A> // OK
class A<X, Y> {
    static doWork<T, U>(_input: T): U {
        return null!;
    }
}

type B_implments_IStatic = HasType<IStatic<number, string>, typeof B> // Error as expected
class B {
    static doWork(n: number) {
        return n + n;
    }
}

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

export abstract class Component {
  public abstract static READ_FROM(buffer: ByteBuffer): Component;
}

// I want to force my DeckComponent class to implement it's own static ReadFrom method
export class DeckComponent extends Component {
  public cardIds: number[];

  constructor(cardIds: number[]) {
    this.cardIds = cardIds;
  }

  public static READ_FROM(buffer: ByteBuffer): DeckComponent {
    const cardIds: number[] = [...];
    return new DeckComponent(cardIds);
  }
}

@RyanCavanaugh рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдЕрднреА рддрдХ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рддреНрд╡рд░рд┐рдд рд░реАрдб-рдереНрд░реВ рдореЗрдВ рдпрд╛рдж рдХрд░ рд╕рдХрддрд╛ рдерд╛), рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ:

рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╕рдордп рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдореБрдЦ рдкреНрд░рд╢реНрди рдерд╛: рдЕрдореВрд░реНрдд рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдХрд┐рд╕реЗ рд╣реИ? рд╕рдВрднрд╡рддрдГ рдЖрдк AbstractParentClass.getSomeClassDependentValue рдХреЛ рд╕реАрдзреЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдк AbstractParentClass рдкреНрд░рдХрд╛рд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд░ рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рдХреНрдпреЛрдВ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рд╣реИ?

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

рддреЛ рдореИрдВ рдЬреЛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреВрдВрдЧрд╛ рд╡рд╣ T.constructor рдкреНрд░рдХрд╛рд░ Function & {{ statics on T }} рджреЗ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬреЛ abstract static foo рдлрд╝реАрд▓реНрдб рдХреЛ this.constructor.foo рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЕрд╕рдВрдЧрддрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ T.constructor рдореЗрдВ рд╕реНрдЯреИрдЯрд┐рдХреНрд╕ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рднреА рд╣рдо рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ "constructor": typeof AbstractParentClass рдШреЛрд╖рд┐рдд рдХрд░рдХреЗ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ abstract static рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред

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

рдпрд╣рд╛рдБ рдореЗрд░рд╛ рджрд░реНрдж рд╣реИ:

abstract class Shape {
    className() {
        return (<typeof Shape>this.constructor).className;
    }
    abstract static readonly className: string; // How to achieve it?
}

class Polygon extends Shape {
    static readonly className = 'Polygon';
}

class Triangle extends Polygon {
    static readonly className = 'Triangle';
}

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп/рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ static implements рдХреНрд▓реЙрдЬ рдкреЗрд╢ рдХрд░ рд╕рдХреЗрдВ? рдЬреИрд╕реЗ

interface Foo {
    bar(): number;
}

class Baz static implements Foo {
    public static bar() {
        return 4;
    }
}

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

( statically implements рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдирдпрд╛ рдХреАрд╡рд░реНрдб рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд░ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рддреЛ рдмрд╣рд╕ рдпреЛрдЧреНрдп рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред)

рдУрдкреА рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрджреЗрд╣ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдореИрдВрдиреЗ рдХрд┐рддрдиреА рднреА рдХреЛрд╢рд┐рд╢ рдХреА, рдореИрдВ рдЕрд╕рдлрд▓ рд░рд╣рд╛ред

рдХреЗрд╡рд▓ рдПрдХ рд╡реНрдпрдХреНрддрд┐ (https://github.com/Microsoft/TypeScript/issues/14600#issuecomment-379645122) рдиреЗ рдЖрдкрдХреЛ @RyanCavanaugh рдЙрддреНрддрд░ рджрд┐рдпрд╛ред рдореИрдВрдиреЗ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрди рдФрд░ рдореЗрд░реЗ рдЙрддреНрддрд░реЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдУрдкреА рдХреЗ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛:

abstract class Base {
  abstract static foo() // ref#1
}

class Child1 extends Base {
  static foo() {...} // ref#2
}

class Child2 extends Base {
  static foo() {...}
}

рдЕрдореВрд░реНрдд рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдХрд┐рд╕реЗ рд╣реИ? рд╕рдВрднрд╡рддрдГ рдЖрдк рд╕реАрдзреЗ Base.foo рдЖрд╣реНрд╡рд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ

рдпрджрд┐ рдЖрдкрдХрд╛ рдорддрд▓рдм рд░реЗрдлрд░реА # 1 рд╣реИ, рддреЛ рд╣рд╛рдБ, рдЗрд╕реЗ рдХрднреА рднреА рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдпрд╣ рд╕рд╛рд░ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рд╢рд░реАрд░ рднреА рдирд╣реАрдВ рд╣реИред
рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд░реЗрдлрд░реА # 2 рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред

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

function bar(baz:Base) { // "expression of type Base"
  baz.foo() // ref#3
}

function bar2(baz: typeof Base) { // expression of type Base.constructor
  baz.foo() // ref#4
}

рд░реЗрдлрд░реА # 3 рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИред рдирд╣реАрдВ, рдЖрдк рд╡рд╣рд╛рдВ "foo" рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ baz рдХреЛ Child1 рдпрд╛ Child2 рдХрд╛ __instance__ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ

рд░реЗрдлрд░реА # 4 рд╕рд╣реА рд╣реИ (рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдЖрдк рд╡рд╣рд╛рдВ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдлреВ рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП), рдХреНрдпреЛрдВрдХрд┐ baz рдХреЛ рдЪрд╛рдЗрд▓реНрдб 1 рдпрд╛ рдЪрд╛рдЗрд▓реНрдб 2 рдХрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рджреЛрдиреЛрдВ рдмреЗрд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП рдлреВ () рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

bar2(Child1) // ok
bar2(Child2) // ok

рдЖрдк рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

bar2(Base) // ok, but ref#4 should be red-highlighted with compile error e.g. "Cannot call abstract  method." 
// Don't know if it's possible to implement in compiler, though. 
// If not, compiler simply should not raise any error and let JS to do it in runtime (Base.foo is not a function). 

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

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

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

pps рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЕрдиреБрдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рд╡рд░реНрдЧ рдФрд░ рд╡рд┐рдзрд┐ рдХреЗ рдирд╛рдо рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдПред

рдЕрдиреНрдп рд╕рдВрд╢рдпрд╡рд╛рджрд┐рдпреЛрдВ рдХреЗ рдореБрдЦреНрдп рддрд░реНрдХреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░:

"рдирд╣реАрдВ, рдЗрд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ * рдХреЛрдб рдХреА 15 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд▓рд╛рдЗрдиреЗрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ *"ред

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

"рдЬреЗрдПрд╕ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рджреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ: рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд▓рд┐рдП"ред

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

рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ:

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

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

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

рд╕рдВрднрд╡ рдЙрдкрд╛рдп?

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

declare global {
  interface Function extends StaticInterface {
  }
}

export interface StaticInterface {
  builder: (this: Constructor<MyClass>) => MyClass
}

// TODO add decorator that adds "builder" implementation
export class MyClass {
  name = "Ayyy"
}

export class OtherClass {
  id = "Yaaa"
}

MyClass.builder() // ok
OtherClass.builder() // error

рдкреНрд░рд╕реНрддрд╛рд╡: рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реНрдерд┐рд░ рд╕рджрд╕реНрдп, рдФрд░ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдореЗрдВ рдЕрдореВрд░реНрдд рд╕рджрд╕реНрдп, v2

рдмрдХреНрд╕реЛрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ

рдлреИрдВрдЯреЗрд╕реАрд▓реИрдВрдб рдХреЗ рдЕрдиреБрд░реВрдк рдкреНрд░рдХрд╛рд░

```` рдЯрд╛рдЗрдкрдкреНрд░рддрд┐
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ {рд╕реНрдерд┐рд░ (рдП: рдП): рд▓рд╛рдЧреВ ; }

const of = >(c: C, a: A): new C => c.of(a); ````

Serializable рд╕реНрдерд┐рд░ deserialize рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдк рдХрд░реЗрдВ

```` рдЯрд╛рдЗрдкрдкреНрд░рддрд┐
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реАрд░рд┐рдпрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп {
рд╕реНрдереИрддрд┐рдХ deserialize(s: string): Serializable;

serialize(): string;

}
````

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдЕрдиреБрдмрдВрдз

```` рдЯрд╛рдЗрдкрдкреНрд░рддрд┐
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрдиреБрдмрдВрдз {
рд╕реНрдерд┐рд░ рдмрдирд╛рдПрдБ (x: рд╕рдВрдЦреНрдпрд╛): рдЕрдиреБрдмрдВрдз;
рд╕реНрдерд┐рд░ рдирдпрд╛ (x: рд╕рдВрдЦреНрдпрд╛): рдЕрдиреБрдмрдВрдз;
}

рдХрд╛рд╕реНрдЯ рдлрд╝реИрдХреНрдЯрд░реА 1 = (рд╕реА: рд╕реНрдерд┐рд░ рдЕрдиреБрдмрдВрдз): рдЕрдиреБрдмрдВрдз => рд╕реА.рдХреНрд░рд┐рдПрдЯ (рдореИрде.рд░реИрдВрдбрдо ());
рдХрд╛рд╕реНрдЯ рдлрд╝реИрдХреНрдЯрд░реА 2 = (рд╕реА: рд╕реНрдерд┐рд░ рдЕрдиреБрдмрдВрдз): рдЕрдиреБрдмрдВрдз => рдирдпрд╛ рд╕реА (рдЧрдгрд┐рддред рдпрд╛рджреГрдЪреНрдЫрд┐рдХ ());
рдХрд╛рд╕реНрдЯ рдлреИрдХреНрдЯреНрд░реА3 =(рд╕реА: рд╕реА): рдирдпрд╛ рд╕реА => рд╕реА.рдХреНрд░рд┐рдПрдЯ (рдореИрде.рд░реИрдВрдбрдо ());

рдХрд╛рд╕реНрдЯ c1 = рдлрд╝реИрдХреНрдЯрд░реА 1 (ContractImpl); // Contract
const c2 = factory2 (ContractImpl); // Contract
const c3 = factory3 (ContractImpl); // ContractImpl
````

рд╡рд╛рдХреНрдп - рд╡рд┐рдиреНрдпрд╛рд╕

рд╕реНрдерд┐рд░ рддрд░реАрдХреЗ рдФрд░ рдХреНрд╖реЗрддреНрд░

```` рдЯрд╛рдЗрдкрдкреНрд░рддрд┐
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реАрд░рд┐рдпрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп {
рд╕реНрдерд┐рд░ deserialize(s: string): Serializable;
}

рд╕реАрд░рд┐рдпрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЯрд╛рдЗрдк рдХрд░реЗрдВ = {
рд╕реНрдерд┐рд░ deserialize(s: string): Serializable;
};

рд╕рд╛рд░ рд╡рд░реНрдЧ рд╕реАрд░рд┐рдпрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп {
рд╕реНрдерд┐рд░ рд╕рд╛рд░ deserialize (рдУрдВ: рд╕реНрдЯреНрд░рд┐рдВрдЧ): Serializable;
}
````

рд╕реНрдЯреЗрдЯрд┐рдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░

typescript interface Contract { static new(): Contract; }

рдлреЙрд▓реЛ-рдСрди: рд╕реНрдЯреЗрдЯрд┐рдХ рдХреЙрд▓ рд╕рд┐рдЧреНрдиреЗрдЪрд░

рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛:

рд╕реНрдерд┐рд░ рдХреЙрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреИрд╕реЗ рд╡реНрдпрдХреНрдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ?
рдЕрдЧрд░ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓ рд╕рд┐рдЧреНрдиреЗрдЪрд░ рд╕реЗ рдкрд╣рд▓реЗ рдХреЗрд╡рд▓ static рд╕рдВрд╢реЛрдзрдХ рдЬреЛрдбрд╝рдХрд░ рд╡реНрдпрдХреНрдд рдХрд░реЗрдВрдЧреЗ,
рд╣рдо рдЙрдиреНрд╣реЗрдВ 'static' рдирд╛рдо рдХреЗ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдореЗрдердб рд╕реЗ рдХреИрд╕реЗ рдЕрд▓рдЧ рдХрд░реЗрдВрдЧреЗ?
рдХреНрдпрд╛ рд╣рдо 'new' -рдирд╛рдорд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рдорд╛рди рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рдРрд╕реЗ рдореЗрдВ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рддреМрд░ рдкрд░ рдПрдХ рдХреНрд░рд╛рдВрддрд┐рдХрд╛рд░реА рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛ред

static рдЯрд╛рдЗрдк рдСрдкрд░реЗрдЯрд░

typescript const deserialize = (Class: static Serializable, s: string): Serializable => Class.deserialize(s);

new рдЯрд╛рдЗрдк рдСрдкрд░реЗрдЯрд░

typescript const deserialize = <C extends static Serializable>(Class: C, s: string): new C => Class.deserialize(s);

рдЖрдВрддрд░рд┐рдХ рд╕реНрд▓реЙрдЯ

[[Static]] рдЖрдВрддрд░рд┐рдХ рд╕реНрд▓реЙрдЯ

рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ "рд╕реНрдЯреЗрдЯрд┐рдХ" рдЗрдВрдЯрд░рдлрд╝реЗрд╕ [[Static]] рдЖрдВрддрд░рд┐рдХ рд╕реНрд▓реЙрдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

```` рдЯрд╛рдЗрдкрдкреНрд░рддрд┐
// рдкреНрд░рд╛рд░реВрдк
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реАрд░рд┐рдпрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп {
рд╕реНрдерд┐рд░ deserialize(s: string): Serializable;
рдХреНрд░рдордмрджреНрдз рдХрд░реЗрдВ: рд╕реНрдЯреНрд░рд┐рдВрдЧ;
}

// рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛
// рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реАрд░рд┐рдпрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп {
// [[рд╕реНрдерд┐рд░]]: {
// [[рдЗрдВрд╕реНрдЯреЗрдВрд╕]]: рд╕реАрд░рд┐рдпрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп; // рдиреАрдЪреЗ рджреЗрдЦреЗрдВред
// deserialize (s: рд╕реНрдЯреНрд░рд┐рдВрдЧ): Serializable;
//};
// рдХреНрд░рдордмрджреНрдз рдХрд░реЗрдВ (): рд╕реНрдЯреНрд░рд┐рдВрдЧ;
// }
````

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ never рдЯрд╛рдЗрдк рдХрд░реЗрдВред

[[Instance]] рдЖрдВрддрд░рд┐рдХ рд╕реНрд▓реЙрдЯ

рдкреНрд░рдХрд╛рд░ рдХрд╛ "рдЗрдВрд╕реНрдЯреЗрдВрд╕" рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
[[Instance]] [[Static]] рдЖрдВрддрд░рд┐рдХ рд╕реНрд▓реЙрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдВрддрд░рд┐рдХ рд╕реНрд▓реЙрдЯ рдореЗрдВред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ never рдЯрд╛рдЗрдк рдХрд░реЗрдВред

рдЕрд░реНрде рд╡рд┐рдЬреНрдЮрд╛рди

static рдСрдкрд░реЗрдЯрд░ рдХреЗ рдмрд┐рдирд╛

рдЬрдм рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ,
[[Static]] рдЖрдВрддрд░рд┐рдХ рд╕реНрд▓реЙрдЯ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

```` рдЯрд╛рдЗрдкрдкреНрд░рддрд┐
рдХреЙрдиреНрд╕реНрдЯреЗрдмрд▓ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ: рд╕реАрд░рд┐рдпрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп;

рдЯрд╛рдЗрдк рдЯреА = рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЯрд╛рдЗрдк рдХрд░реЗрдВ;
// {рдХреНрд░рдордмрджреНрдз рдХрд░реЗрдВ (): рд╕реНрдЯреНрд░рд┐рдВрдЧ; }
````

рд▓реЗрдХрд┐рди рдкреНрд░рдХрд╛рд░ рд╣реА рд░рд╣рддрд╛ рд╣реИ [[Static]] рдЖрдВрддрд░рд┐рдХ рд╕реНрд▓реЙрдЯ:

typescript type T = Serializable; // { // [[Static]]: { // [[Instance]]: Serializable; // deserialize(s: string): Serializable; // }; // serialize(): string; // }

рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ:

рд╕реНрдерд┐рд░-рдЬрд╛рдЧрд░реВрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рджреЛрдиреЛрдВ рдорд╛рди рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рдорд╛рди рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ
(рдмреЗрд╢рдХ [[Static]] рдХреЛ рдЫреЛрдбрд╝рдХрд░) рд╡рд╛рд▓реЗ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред

static рдСрдкрд░реЗрдЯрд░

| рд╕рд╣рдпреЛрдЧреАрддрд╛ | рд╡рд░реАрдпрддрд╛ |
| :-----------: | :--------------------------------: |
| рд╕рд╣реА | рдЖрдИрдбреАрдХреЗ, рд▓реЗрдХрд┐рди new рдХреЗ рдПрдХ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ |

static рдкреНрд░рдХрд╛рд░ рдХрд╛ рдСрдкрд░реЗрдЯрд░ [[Static]] рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдВрддрд░рд┐рдХ рд╕реНрд▓реЙрдЯ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ typeof рдЯрд╛рдЗрдк рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рдорд╛рди рд╣реИ,
рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рддрд░реНрдХ рдорд╛рди рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

typescript type T = static Serializable; // { // [[Instance]]: Serializable; // deserialize(s: string): Serializable; // }

typeof рдкреНрд░рдХрд╛рд░ рдХрд╛ рдСрдкрд░реЗрдЯрд░ [[Instance]] рдЖрдВрддрд░рд┐рдХ рд╕реНрд▓реЙрдЯ рдХреЛ рднреА рддреНрдпрд╛рдЧ рджреЗрддрд╛ рд╣реИ:

```` рдЯрд╛рдЗрдкрдкреНрд░рддрд┐
рд╕реНрдерд┐рд░рд╛рдВрдХ SerializableImpl рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ: рд╕реНрдерд┐рд░ Serializable;

рдЯрд╛рдЗрдк рдЯреА = рдЯрд╛рдЗрдкрдСрдлрд╝ SerializableImpl;
// { deserialize (s: string): Serializable; }
````

рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ:

рдЙрджрд╛рд╣рд░рдг-рдЬрд╛рдЧрд░реВрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рджреЛрдиреЛрдВ рдорд╛рди рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рдорд╛рди рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ
( [[Instance]] рдЖрдВрддрд░рд┐рдХ рд╕реНрд▓реЙрдЯ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ) рд╡рд╛рд▓реЗ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред

new рдСрдкрд░реЗрдЯрд░

| рд╕рд╣рдпреЛрдЧреАрддрд╛ | рд╡рд░реАрдпрддрд╛ |
| :-----------: | :------------------------------------------: |
| рд╕рд╣реА | рдЖрдИрдбреАрдХреЗ, рд▓реЗрдХрд┐рди static рдХреЗ рдПрдХ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ |

new рдСрдкрд░реЗрдЯрд░ [[Instance]] рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдВрддрд░рд┐рдХ рд╕реНрд▓реЙрдЯ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред
рдпрд╣ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ static рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЙрд▓рдЯ рджреЗрддрд╛ рд╣реИ:

typescript type T = new static Serializable; // { // [[Static]]: { // [[Instance]]: Serializable; // deserialize(s: string): Serializable; // }; // serialize(): string; // }

extends / implements рд╢рдмреНрджрд╛рд░реНрде

рдЧреИрд░-рдбрд┐рдлрд╝реЙрд▓реНрдЯ [[Static]] рдЖрдВрддрд░рд┐рдХ рд╕реНрд▓реЙрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╡рд░реНрдЧ
рдПрдХ рд╕рдВрдЧрдд [[Static]] рдЖрдВрддрд░рд┐рдХ рд╕реНрд▓реЙрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рдВрдЧрддрддрд╛ рдЬрд╛рдВрдЪ рд╕рдорд╛рди рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП (рдпрд╛ рдЗрд╕рдХреЗ рд╕рдорд╛рди)
рдирд┐рдпрдорд┐рдд (рдЙрджрд╛рд╣рд░рдг) рд╕рдВрдЧрддрддрд╛ рдЬрд╛рдВрдЪред

```` рдЯрд╛рдЗрдкрдкреНрд░рддрд┐
рд╡рд░реНрдЧ SerializableImpl Serializable рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ {
рд╕реНрдереИрддрд┐рдХ deserialize(s: string): SerializableImpl {
// рдбрд┐рд╕реЗрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдпрд╣рд╛рдБ рдЬрд╛рддрд╛ рд╣реИред
}

// ...other static members
// constructor
// ...other members

serialize(): string {
    //
}

}
````

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

  • [ ] рддрдп рдХрд░реЗрдВ рдХрд┐ рд╕реНрдерд┐рд░ рдХреЙрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
    рд╕рдВрднрд╡рддрдГ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ред
  • [ ] рдХреНрдпрд╛ рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░ рдФрд░ infer рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ?
  • [ ] рдЧреИрд░-рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиред _рдмреНрд░реЗрдХрд┐рдВрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред_

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

рдореЗрд░реЗ рдкрд╛рд╕ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рдХреЛрдб рдЬреЗрдирд░реЗрдЯреЗрдб рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореИрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

import {Message} from "../protobuf";

declare module "../protobuf" {
    interface Message {
        static factory: (params: MessageParams) => Message
    }
}

Message.factory = function(params: MessageParams) {
    const message = new Message();
    //... set up properties
    return message;
}

export default Message;

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

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

рдпрджрд┐ рдЖрдк рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рдХрдХреНрд╖рд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдФрд░ рд╕реНрдерд┐рд░ рдкрдХреНрд╖ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

interface C1Instance {
  // Instance properties ...

  // Prototype properties ...
}
interface C2Instance extends C1Instance {
  // Instance properties ...

  // Prototype properties ...
}

interface C1Constructor {
  new (): C1Instance;

  // Static properties ...
}
interface C2Constructor {
  new (): C2Instance;

  // Static properties ...
}

type C1 = C1Instance;
let C1: C1Constructor = class {};

type C2 = C2Instance;
let C2: C2Constructor = class extends C1 {};

let c1: C1 = new C1();
let c2: C2 = new C2();

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

рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдмрд╛рдд, рдкреНрд░рд╛рдХреГрддрд┐рдХ рдФрд░ рдХреГрддреНрд░рд┐рдо рджреЛрдиреЛрдВ, рдХрд┐ рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдХреБрд╢рд▓ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЖрдХрд░реНрд╖рдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЕрдВрддрддрдГ рд▓реЛрдЧреЛрдВ рдиреЗ рднрд╛рд╖рд╛ рдореЗрдВ рдХрдЯреМрддреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, ("рдУрдХреЗ" => "рдУрдХреЗ", "рдЧреЛрдЗрдВрдЧ рдЯреВ" => "рдЧреЛрдирд╛"), "рд╕реЗрд▓реНрдлреА" рдФрд░ "рдЧреВрдЧрд▓" рдЬреИрд╕реЗ рдирдП рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рд╢рдмреНрджреЛрдВ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛, рд╡рд░реНрддрдиреА рдХреЛ l33tspeak рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдФрд░ рд╕рд╛рдорд╛рди, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдХреБрдЫ рд╢рдмреНрджреЛрдВ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛ рджрд┐рдпрд╛, рдФрд░, рднрд▓реЗ рд╣реА рдЖрдк рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рдлрд┐рд░ рднреА рд╣рд░ рдХреЛрдИ рдереЛрдбрд╝реЗ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рдФрд░ рд╣рдо рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреА рджрдХреНрд╖рддрд╛, рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдмрд╛рддрдЪреАрдд рдХреА рдорд╛рддреНрд░рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рддреА рд╣реИ, рдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЛрдЧ рдЗрд╕ static abstract рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рднреА рдЙрдирдХреЗ рдорди рдореЗрдВ рд╣реИрдВред рдореИрдВ рдпрд╣рд╛рдВ рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ рдЖрдпрд╛ рдерд╛, 'рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ Serializable рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд╕рднреА рд╕рд╣рдЬ (рдореЗрд░реЗ рд▓рд┐рдП) рддрд░реАрдХреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░реЛ, рдЖрдЦрд┐рд░реА рдЪреАрдЬ рдЬреЛ рдореИрдВ рдвреВрдВрдвреВрдВрдЧрд╛ рд╡рд╣ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ рдФрд░ рдХреБрдЫ рдФрд░ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдбреЗрдврд╝ рд╕рд╛рд▓, рдпреАрд╢реБ рдорд╕реАрд╣! рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдФрд░ рд╕рд╛рдорд╛рди рдХреЗ рд╕рд╛рде рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдкреАрдЖрд░ рд╣реИред рдХреГрдкрдпрд╛ рдРрд╕рд╛ рдХрд░реЗрдВ, рдФрд░ рдпрджрд┐ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ tslint рд╣реИред

this.constructor.staticMember рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╕реЗ рдмрд╛рд▓ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕реНрдерд┐рд░ рд╕рджрд╕реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдореВрд░реНрдд рд╕реНрдерд┐рд░ рд╕рджрд╕реНрдп рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред

class A {
  f() {
    console.log(this.constructor.x)
  }
}

class B extends A {
  static x = "b"
}

const b = new B
b.f() // logs "b"

рдХрдХреНрд╖рд╛ рдП рдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЙрд╕реЗ рд╕реНрдерд┐рд░ x рд╕рджрд╕реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд╕реЗ f рд╡рд┐рдзрд┐ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдХреЛрдИ рдЦрд╝рдмрд░ ?
рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
1) static рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ
2) abstract static рдЕрдореВрд░реНрдд рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд╕реНрдерд┐рд░ рдЗрдВрдЯрд░рдлреЗрд╕ рд░рдЦрдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдирдлрд░рдд рд╣реИ рд▓реЗрдХрд┐рди рд╕рднреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдЬ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

type MyClass =  (new (text: string) => MyInterface) & { myStaticMethod(): string; }

рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

const MyClass: MyClass = class implements MyInterface {
   constructor(text: string) {}
   static myStaticMethod(): string { return ''; }
}

рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:

рд╡рд┐рдЪрд╛рд░ рдФрд░ рдПрдХ рдЬреАрд╡рдВрдд рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА:

// dynamic part
interface MyInterface {
    data: number[];
}
// static part
interface MyStaticInterface {
    myStaticMethod(): string;
}

// type of a class that implements both static and dynamic interfaces
type MyClass = (new (data: number[]) => MyInterface) & MyStaticInterface;

// way to make sure that given class implements both 
// static and dynamic interface
const MyClass: MyClass = class MyClass implements MyInterface {
   constructor(public data: number[]) {}
   static myStaticMethod(): string { return ''; }
}

// works just like a real class
const myInstance = new MyClass([]); // <-- works!
MyClass.myStaticMethod(); // <-- works!

// example of catching errors: bad static part
/*
type 'typeof MyBadClass1' is not assignable to type 'MyClass'.
  Type 'typeof MyBadClass1' is not assignable to type 'MyStaticInterface'.
    Property 'myStaticMethod' is missing in type 'typeof MyBadClass1'.
*/
const MyBadClass1: MyClass = class implements MyInterface {
   constructor(public data: number[]) {}
   static myNewStaticMethod(): string { return ''; }
}

// example of catching errors: bad dynamic part
/*
Type 'typeof MyBadClass2' is not assignable to type 'MyClass'.
  Type 'typeof MyBadClass2' is not assignable to type 'new (data: number[]) => MyInterface'.
    Type 'MyBadClass2' is not assignable to type 'MyInterface'.
      Property 'data' is missing in type 'MyBadClass2'.
*/
const MyBadClass2: MyClass = class implements MyInterface {
   constructor(public values: number[]) {}
   static myStaticMethod(): string { return ''; }
}

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

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

// no errors
class Thing extends MyClass {

}

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

@bbugh рдореИрдВ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдкрд░ рд╕рд╡рд╛рд▓ рдЙрдард╛рддрд╛ рд╣реВрдВ, рдпрджрд┐ рдирд┐рдпрдорд┐рдд рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдРрд╕рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддреЛ рдЖрдкрдХреЛ рд╕реНрдерд┐рд░ рдЕрдореВрд░реНрдд рд╡рд┐рд░рд╛рд╕рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЗрди рд╕рднреА рдкрд░реЗрд╢рд╛рдирд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛрдЧреА?

class MyAbstractStaticClass {
    abstract static myStaticMethod(): void; // <-- wish we could
}
class MyStaticClass extends MyAbstractStaticClass {
    static myStaticMethod(): void {
         console.log('hi');
    }
}
MyStaticClass.myStaticMethod(); // <-- would be great

рдмрдирд╛рдо

class MyAbstractNonStaticClass {
    abstract myAbstractNonStaticMethod(): void;
}
class MyNonStaticClass extends MyAbstractNonStaticClass {
    myNonStaticMethod(): void {
        console.log('hi again');
    }
}
new MyNonStaticClass().myNonStaticMethod(); // <-- works today

@ рдПрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рд░рдг рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП (@ patryk-zielinski93 рд╕реЗ ):

abstract class Serializable {  
    abstract serialize (): Object;  
    abstract static deserialize (Object): Serializable;  
}  

рдореИрдВ Serializable рдХреЗ рдЙрдкрд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реНрдереИрддрд┐рдХ deserialize рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрд╛рдзреНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред
рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реИ?

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

рдмрд╕ рд╡рд╛рдВрдЫрд┐рдд рддрд░реНрдХ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдВ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╕реНрдерд┐рд░ deserialize рд╡рд┐рдзрд┐ рд╣реЛрдиреЗ рдХрд╛ рдХреЛрдИ рд▓рд╛рдн рдирд╣реАрдВ рд╣реИ рдЬреЛ рдмрд╣реБрдд рд╣реА рд╡рд░реНрдЧ рд╕реЗ deserialized рдЬрд╛ рд░рд╣рд╛ рд╣реИ

class Deserializer {
     deserializeThis(...): Xxx {}
     deserializeThat(...): Yyy {}
}

рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИ?

@ рдПрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡ рдЕрд▓рдЧ рд╡рд░реНрдЧ рд╕реБрдВрджрд░ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ

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

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

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

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

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

рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЖрдкрдХреЛ рдХреЛрдб рдХреЛ рдПрдХ рдХреЗ рдмрдЬрд╛рдп рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ (рдбреА) рдХреНрд░рдорд╛рдВрдХрди рдЖрдкрдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ "рдПрдХрд▓ рдЬрд┐рдореНрдореЗрджрд╛рд░реА" рдХреА рдУрд░ рдирд╣реАрдВ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИ

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

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

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

рдореИрдВ рдЬреЛ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХрд╛ рдорддрд▓рдм рдХреЗрд╡рд▓ deserialized рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХрд╛ рдПрдХ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╕реМрдВрдкреА рдЬрд╛рддреА рд╣реИ; рдлрд┐рд░ рдЖрдк рдЦреБрдж рдХреЛ deserialize рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдПрдХ рдФрд░ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдпрд╣ рд╣рдореЗрдВ 2 рдЬрд┐рдореНрдореЗрджрд╛рд░рд┐рдпрд╛рдВ рджреЗрддрд╛ рд╣реИ, рдпрд╣ SOLID рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк рдЗрд╕рдореЗрдВ рдФрд░ рд╕рд╛рдорд╛рди рдЬреЛрдбрд╝рддреЗ рд░рд╣рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рд░реЗрдВрдбрд░, рдкреНрд░рд┐рдВрдЯ, рдХреЙрдкреА, рдЯреНрд░рд╛рдВрд╕рдлрд░, рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ, рдЖрджрд┐ рдЖрдкрдХреЛ рдПрдХ рдЧреЙрдб рдХреНрд▓рд╛рд╕ рдорд┐рд▓реЗрдЧрд╛

рдФрд░ рдореБрдЭреЗ рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдмрдВрдз рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рд▓рд╛рдн рдФрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди (рдФрд░ рдЙрддреНрддрд░) рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ

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

рдпрд╛рд░, рдХреЛрдИ рднреА рдЕрдЪреНрдЫрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

image

рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдХреБрдЫ рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рд╡реНрдпрдХреНрдд рдХреА рдФрд░ рдПрдХ рдкреНрд░рд╢реНрди рдкреВрдЫрд╛, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдпрд╣ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИ, рдЖрдк рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ

рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдХреЗ рд▓рд┐рдП рдЙрдмрд▓рд╛ рд╣реБрдЖ рд╣реИ: рдмрд╕ рдХрд╛рд░рдг, рд╣рд┐рдореНрдордд рдордд рдХрд░реЛ

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдареЛрд╕ рдпрд╛ рдКрдк рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рдмрдврд╝рд╛ рджрд┐рдпрд╛ рдерд╛, рдЖрдкрдиреЗ рдЗрд╕реЗ "uberclass antipattern" рддрд░реНрдХ рдлреЗрдВрдХ рдХрд░ рд▓рд╛рдпрд╛ рдФрд░ рдлрд┐рд░ "рдЗрд╕рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдХреА рдПрдХ рдбрд┐рдЧреНрд░реА" рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ред

рдЗрд╕ рдкреВрд░реА рдЪрд░реНрдЪрд╛ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдПрдХрдорд╛рддреНрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ: https://github.com/Microsoft/TypeScript/issues/14600#issuecomment -308362119

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

рдФрд░ рдХреБрдЫ рдкреЛрд╕реНрдЯ рдПрдХ рдЬреИрд╕реЗ https://github.com/Microsoft/TypeScript/issues/14600#issuecomment -345496014

рд▓реЗрдХрд┐рди рдпрд╣ (new (...) => MyClass) & MyStaticInterface . рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдпрд╣ рд╕рдЯреАрдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдФрд░ рдПрдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдВ рд╣реВрдВред рдХреНрдпрд╛ рдЖрдк рд╡реЛрдЯреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ? рдЖрдкрдХреЛ рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ practical рдХреНрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВ, рдпрд╣ рддрдп рдХрд░рдирд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ? Practical рд╡рд╣ рд╣реИ рдЬрд┐рд╕реЗ practice рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ (рд▓рд┐рдЦрдиреЗ рдХреЗ рдХреНрд╖рдг рдореЗрдВ) 83 рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдмрд╣реБрдд рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд▓рдЧреЗрдЧреАред рдХреГрдкрдпрд╛ рджреВрд╕рд░реЛрдВ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░реЗрдВ рдФрд░ рд╡рд╛рдХреНрдпрд╛рдВрд╢реЛрдВ рдХреЛ рд╕рдВрджрд░реНрдн рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдФрд░ рд╡рд┐рднрд┐рдиреНрди buzzwords рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреВрд░рд╛ рдзрд╛рдЧрд╛ рдкрдврд╝реЗрдВред рдЖрдкрдиреЗ рдЬреЛ рдХреБрдЫ рднреА рдкрд╛рд░ рдХрд┐рдпрд╛ рдерд╛, рд╡рд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХрд╛ рдЕрд╣рдВрдХрд╛рд░ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди рд╣реИ рдХрд┐ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЪреАрдЬреЗрдВ рд╡реЗ рд╣реИрдВ рдЬреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддреА рд╣реИрдВ, рдЧреИрд░-рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЪреАрдЬреЗрдВ рд╡реЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреА рд╕реБрдВрджрд░рддрд╛ рдХреА рднрд╛рд╡рдирд╛ рдХреЛ рдЭреБрдХрд╛рддреА рд╣реИрдВ, рдореИрдВ рджреВрд╕рд░реЛрдВ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддрд╛ рд╣реВрдВ (рдЕрдм рдЬреНрдпрд╛рджрд╛рддрд░ рдмрдпрд╛рдирдмрд╛рдЬреА) рдЕрднреА рднреА рд░рдЦрддреА рд╣реИ: рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддрд╛ рд╣реИ https://github.com/Microsoft/TypeScript/issues/14600#issuecomment -308362119 рдФрд░ https://github.com/Microsoft/TypeScript/issues/14600#issuecomment -289084844 рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП (new (...) => MyClass) & MyStaticInterface рдХреЛ рд╣рд▓ рдХрд░реЗрдВ

рдХреГрдкрдпрд╛ рдЙрддреНрддрд░ рди рджреЗрдВ

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдордиреЗ рдЕрднреА рднреА рдЕрдореВрд░реНрдд рд╡рд░реНрдЧреЛрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ?

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЕрдореВрд░реНрдд рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред рдпрд╣ рдПрдХ рдХрд╛рдордХрд╛рдЬ рд╣реИ! рдПрдХ рдХрд╛рдордХрд╛рдЬ рдХреНрдпрд╛ рдЖрд╕рдкрд╛рд╕?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рдореМрдЬреВрдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреБрд░реЛрдзрдХрд░реНрддрд╛ рд╕рд╣рд┐рдд рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ abstract static рдпрд╛ static рдЬреИрд╕реА рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕реБрд╡рд┐рдзрд╛ рдореМрдЬреВрдж рдирд╣реАрдВ рдереАред

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

рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ static рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдЙрддреНрдкрдиреНрди рд░реБрдЪрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдХреНрдпрд╛ рд╣рдо рдХреБрдЫ рдХрдо рдЦрд╛рд░рд┐рдЬ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЪрд░реНрдЪрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

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

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

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдБ рджреЛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИрдВ:

  1. рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдкреНрд░рдХрд╛рд░ рд╕реНрдерд┐рд░ рдЧреБрдгреЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
interface ISerializable<T> { 
   static fromJson(json: string): T;
}
  1. рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдЕрдореВрд░реНрдд рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
abstract class MyClass<T> implements ISerializable<T> {
   abstract static fromJson(json: string): T;
}

class MyOtherClass extends MyClass<any> {
  static fromJson(json: string) {
  // unique implementation
  }
}

рдкреНрд░рд╕реНрддрд╛рд╡ рдПрдХ рдХреЗ рд▓рд┐рдП, рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдПрдХ рдХрд╛рдордХрд╛рдЬ рд╣реИ! рдЬреЛ рдорд╣рд╛рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╣ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдХрд╛рдордХрд╛рдЬ рд╣реИред

рдЖрдк рдЕрдкрдиреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ

interface StaticInterface {
  new(...args) => MyClass;
  fromJson(json): MyClass;
}

interface InstanceInterface {
  toJson(): string;
}

const MyClass: StaticInterface = class implements InstanceInterface {
   ...
}

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

рд▓реЗрдХрд┐рди рдлрд┐рд░, рдкреНрд░рд╕реНрддрд╛рд╡ 2 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣реИ рдирд╛? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рднреА рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ!

рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреНрдпрд╛ рд╣реИтАФрдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?

interface JsonSerializable {
    toJSON(): string;
    static fromJSON(serializedValue: string): JsonSerializable;
}

рдпрд╣ рдХрд╣рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХреЛрдИ рдорд╛рди { fromJSON(serializedValue: string): JsonSerializable; } рдЬреИрд╕реА рд╡рд╕реНрддреБ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдХреНрдпрд╛ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд╛рд╣рддрд╛ рд╣реИ? рдореБрдЭреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЗрд╕рдХрд╛ рд▓рд╛рдн рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред рдПрдХ рд╕рд╛рдЗрдб рдиреЛрдЯ рдХреЗ рд░реВрдк рдореЗрдВ: рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдПрдХ рдРрд╕реЗ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ- рдХреНрд░рдорд╛рдВрдХрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╡рд░реНрдЧреЛрдВ рдпрд╛ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдореИрдВ рдпрд╣рд╛рдВ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреВрдВрдЧрд╛ред

рд╕рд╛рде рд╣реА, рдРрд╕рд╛ рдХреБрдЫ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ?

class FirstChildClass extends AbstractParentClass {
    public static getSomeClassDependentValue(): string {
        return 'Some class-dependent value of class FirstChildClass';
    }
}

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

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

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

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

interface Component {
    constructor: ComponentConstructor;
}

interface ComponentConstructor {
    displayName?: string;
}

class MyComponent implements Component {
    static displayName = 5; // error
}

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


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

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╛рди рд╡рд┐рдЪрд╛рд░ рдерд╛: https://github.com/Microsoft/TypeScript/issues/14600#issuecomment -437071092

рдХреНрдпрд╛ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ/deserialize рдкреИрдЯрд░реНрди рдЕрдкрдереНрд░реЗрдб рд╡рд░реНрдгрд┐рдд "рд╡реИрдз" рдирд╣реАрдВ рд╣реИ?

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

рдорд╛рди рд▓реАрдЬрд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рд╕реНрдерд┐рд░ foo(x: number, y: boolean, z: string) рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рднрд╛рдИ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрдореНрдореАрдж рдпрд╣ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдлреИрдХреНрдЯреНрд░реА рдХреНрд▓рд╛рд╕ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ рдХрдХреНрд╖рд╛рдПрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред (рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ deserialize рдпрд╛ clone рдпрд╛ unpack рдпрд╛ loadFromServer рд╣реЛ, рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред) рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдорд╛рди (рд╕рдВрднрд╡рддрдГ рд╕рд╛рд░) рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдЙрдкрд╡рд░реНрдЧ рднреА рдмрдирд╛рддрд╛ рд╣реИ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдХрдХреНрд╖рд╛ред

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

рдореИрдВ рдЧрд╛рд░рдВрдЯреА рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдВрдЧреЗред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЙрдкрд░реЛрдХреНрдд рд╕реНрдерд┐рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рд╣реИ (рдЬреИрд╕реЗ type MyClass = (new (data: number[]) => MyInterface) & MyStaticInterface; ) рдФрд░ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЙрдкрднреЛрдХреНрддрд╛ рдиреЗ рдЗрд╕реЗ рд╕рднреА рд╕рд╣реА рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред рдпрджрд┐ рд╡реЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреВрд▓ рдЧрдП рд╣реИрдВ рдпрд╛ рдпрджрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдкрдиреЗ рдХрд╛рд░рдЦрд╛рдиреЗ рд╡рд░реНрдЧ рдореЗрдВ foo рдХреЗ рдХреЙрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╕рдВрдХрд▓рдХ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓рддреА рд╣реИрдВ . рддреБрд▓рдирд╛ рдХрд░реЗрдВ рдХрд┐ рдореВрд▓ рд╡рд░реНрдЧ рдореЗрдВ abstract static рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдПрдХ рд╕рдордЭрджрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде - рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдПрдиреЛрдЯреЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдкрд░ рдХреЛрдИ рдмреЛрдЭ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

@ thw0rted рдХреНрдпрд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрдВрдЬреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдФрд░ рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЯрд╛рдЗрдк рдЬрд╛рдВрдЪ рд╣реЛ рд╕рдХрддреА рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

// in the library code...
class SomeLibraryContext {
    register(classCtor: Function & { deserialize(serializedString: string): Component; }) {
        // etc...
    }
}

// then in the user's code
class MyComponent extends Comonent {
    static deserialize(serializedString: string) {
        return JSON.parse(serializedString) as Component;
    }
}

const context = new SomeLibraryContext();
// type checking occurs here today. This ensures `MyComponent` has a static deserialize method
context.register(MyComponent);

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

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

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

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

рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░, рдореИрдВрдиреЗ рдЗрд╕реЗ shortName рдФрд░ longName рджреЛрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рджрд┐рдпрд╛ (рдЙрдкрд▓рдмреНрдз рд╕реНрдХреНрд░реАрди рд╕реНрдкреЗрд╕ рдХреА рд╡рд┐рднрд┐рдиреНрди рдорд╛рддреНрд░рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП)ред abstract static name: string; рдХреЛ abstract static shortName: string; рдЖрджрд┐ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП providerList: Type<Provider> & { shortName: string } & { longName: string } рдХреЗ рд▓рд┐рдП рдкрд┐рдХ-рд▓рд┐рд╕реНрдЯ рдШрдЯрдХ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рдЕрдзрд┐рдХ рд╕рд░рд▓ рд╣реЛрддрд╛ред рдпрд╣ рдЗрд░рд╛рджреЗ рдХреЛ рд╕рд╣реА рдЬрдЧрд╣ рдкрд░ (рдЕрд░реНрдерд╛рдд рдЕрдореВрд░реНрдд рдорд╛рддрд╛-рдкрд┐рддрд╛ рдореЗрдВ, рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдШрдЯрдХ рдореЗрдВ рдирд╣реАрдВ) рдмрддрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдФрд░ рдмрджрд▓рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдирд┐рд╖реНрдкрдХреНрд╖ рд░реВрдк рд╕реЗ рдмрджрддрд░ рд╣реИред

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

рдореЗрд░реА рд╡рд░реНрддрдорд╛рди рд╕рдорд╕реНрдпрд╛: рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдирд┐рдЬреА .js рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВ рдЕрдкрдиреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЖрдЧреЗ рдмрдврд╝рдХрд░ рдЙрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдПрдХ .d.ts рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреНрдпрд╛ рд╣реИ?

рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

@рдЧреНрд░реАрдиреА https://github.com/Microsoft/TypeScript/issues/14600#issuecomment -449610196

@greeny рдпрд╣рд╛рдБ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕рдорд╛рдзрд╛рди рд╣реИ: https://github.com/Microsoft/TypeScript/issues/14600#issuecomment -437071092

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛:

type MyClass = (new (text: string) => MyInterface) & { myStaticMethod(): string; }

рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛: рдЬреЗрдирд░реЗрдЯ рдХреЛрдб/рдЖрдВрд╢рд┐рдХ рд╡рд░реНрдЧ рд╢рд┐рдореНрд╕

  • рдореИрдВ @rsuter/nswag рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ рд╕реНрд╡реИрдЧрд░ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред
  • рдЖрдк рдПрдХ 'рдПрдХреНрд╕рдЯреЗрдВрд╢рди' рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЬреЗрдирд░реЗрдЯ рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд┐рд▓рдп рд╣реЛ рдЬрд╛рддреА рд╣реИред
  • рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд╝рд╛рдЗрд▓ рдХрднреА рдирд╣реАрдВ рдЪрд▓рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ!
  • рдХрднреА-рдХрднреА рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рднреАрддрд░ рдореБрдЭреЗ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬрд╝ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЕрднреА рддрдХ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрддреНрдкрдиреНрди рд╣реБрдИ рд╣реИ)
  • рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд┐рдо/рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ
  • рдиреЛрдЯ: рдЖрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдВрддрд┐рдо рд╡рд┐рд▓рдп рдореЗрдВ рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд import рдХрдердиреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдВрддрд┐рдо рдЬреЗрдирд░реЗрдЯ рдХреЛрдб рдореЗрдВ 'shim' рд╢рд╛рдорд┐рд▓ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
interface SwaggerException
{
    static isSwaggerException(obj: any): obj is SwaggerException;
}

рд▓реЗрдХрд┐рди рдореИрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рд▓рд┐рдЦрдирд╛ рд╣реИ - рдЬреЛ рдареАрдХ рд╣реИ рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИред рдореИрдВ рдмрд╕ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рдЬреИрд╕рд╛ рдХрд┐ рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдиреЗ рдХрд╣рд╛ рд╣реИ - 'рдпрд╣ рдЕрдиреБрдмрдВрдз рд╣реИ' рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрд▓реАрдирд░ d.ts рдлрд╛рдЗрд▓реЗрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдФрд░ рдЙрди рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдУрд╡рд░рд▓реИрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред JQueryStatic рдЬреИрд╕реЗ рдХреБрдЫ рдХреЛ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╣реИрдХ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ d.ts рдлрд╛рдЗрд▓реЗрдВ рдЕрдХреНрд╕рд░ рдкреБрд░рд╛рдиреА рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ рд░рдЦрд░рдЦрд╛рд╡ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЦреБрдж рдХреЛ рд╢рд┐рдо рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

(jQuery рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ)

рдХреНрд░рдордмрджреНрдзрддрд╛ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдРрд╕рд╛ рдХреБрдЫ рдХрд┐рдпрд╛ред

export abstract class World {

    protected constructor(json?: object) {
        if (json) {
            this.parseJson(json);
        }
    }

    /**
     * Apply data from a plain object to world. For example from a network request.
     * <strong i="6">@param</strong> json Parsed json object
     */
    abstract parseJson(json: object): void;

    /**
     * Parse instance to plane object. For example to send it through network.
     */
    abstract toJson(): object;
}

рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрднреА рднреА рдЖрд╕рд╛рди рд╣реЛрдЧрд╛:

export abstract class World {

    /**
     * Create a world from plain object. For example from a network request.
     * <strong i="10">@param</strong> json Parsed json object
     */
    abstract static fromJson(json: object): World;

    /**
     * Parse instance to plane object. For example to send it through network.
     */
    abstract toJson(): object;
}

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

рдпрд╣ рдореБрджреНрджрд╛ рджреЛ рд╕рд╛рд▓ рдЦреБрд▓рд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ 79 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рд╣реИрдВред рдЗрд╕реЗ Awaiting More Feedback рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдмрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдФрд░ рдХреНрдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЪрд╛рд╣рд┐рдП?

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд▓рд╛.js рдкреЗрдЬ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреЗрдЬ рдкреНрд░реЙрдкрд░реНрдЯреА рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░ getInitialProps рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдлреЗрдВрдХрддрд╛ рд╣реИ, рддреЛ рдкреГрд╖реНрда рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рддреНрд░реБрдЯрд┐ рдкреГрд╖реНрда рд╣реЛрддрд╛ рд╣реИред

https://github.com/zeit/next.js/blob/master/packages/next/README.md#fetching -data-and-component-lifecycle

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

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

рд╕реНрдЯреЗрдЯрд┐рдХ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдХрднреА рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ

рдХреМрди рд╕реНрдЯреИрдЯрд┐рдХ рдореЗрдердб рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдпрд╛ рд╕реНрдЯреИрдЯрд┐рдХ рдлреАрд▓реНрдб рдХреЛ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ? рдореИрдВ

  • рдмрд╛рд▓ рд╡рд░реНрдЧ: рдпрд╣ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдореВрд▓ рд╡рд░реНрдЧ: рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
  • рдЕрдиреНрдп: ISomeClassConstructor рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдХреНрдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИ?ЁЯдФЁЯдФЁЯдФЁЯдФ

рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рдмрд┐рд▓реНрдХреБрд▓?

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

рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

export const statics = <T extends new (...args: Array<unknown>) => void>(): ((c: T) => void) => (_ctor: T): void => {};

рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рд╕реНрдерд┐рд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕рджрд╕реНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬрд┐рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

interface MyStaticType {
  new (urn: string): MyAbstractClass;
  isMember: boolean;
}

рдФрд░ рдЙрд╕ рд╡рд░реНрдЧ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ T рдкрд░ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

@statics<MyStaticType>()
class MyClassWithStaticMembers extends MyAbstractClass {
  static isMember: boolean = true;
  // ...
}

рд╕рдмрд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рдЙрджрд╛рд╣рд░рдг рдЕрдЪреНрдЫрд╛ рд╣реИ:

interface JsonSerializable {
    toJSON(): string;
    static fromJSON(serializedValue: string): JsonSerializable;
}

рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ #13462 рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ:

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

рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╡рд╕реНрддреБ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдПрдХ static рдкреНрд░рддреАрдХ рдХреЗрд╡рд▓ рдПрдХ рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕рдХреЗ рд╕рднреА рджреЛрд╖реЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:


рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдпрд╛ рддреЛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдпрд╛ рдХреНрд▓рд╛рд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдорд╛рди рд▓реЗрдВ рдХрд┐ class_interface рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдПрдХ рдХреНрд▓рд╛рд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдиреЛрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

class_interface ISerDes {
    serialize(): string;
    static deserialize(str: string): ISerDes
}

рдХреНрд▓рд╛рд╕ (рдФрд░ рдХреНрд▓рд╛рд╕ рдЗрдВрдЯрд░рдлреЗрд╕) рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рд╕реНрдерд┐рд░ рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП statically implements рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ( рдХреНрд▓рд╛рд╕ рдЗрдВрдЯрд░рдлреЗрд╕ statically рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред

рдХреНрд▓рд╛рд╕ (рдФрд░ рдХреНрд▓рд╛рд╕ рдЗрдВрдЯрд░рдлреЗрд╕) рдЕрднреА рднреА рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдВрдЯрд░рдлреЗрд╕ рдпрд╛ рдХреНрд▓рд╛рд╕ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде implements рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

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

interface ISerializable{
    serialize(): string;
}
interface IDeserializable{
    deserialize(str: string): ISerializable
}

class_interface ISerDes implements ISerializable statically implements IDeserializable {}

рдЗрд╕ рддрд░рд╣, рдЗрдВрдЯрд░рдлреЗрд╕ рдЕрдкрдирд╛ рдЕрд░реНрде рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ class_interface рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдореВрд░реНрдд рдкреНрд░рддреАрдХ рд╣реЛрдЧрд╛ред

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

рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬрд╝ рдЪрд╛рд╣рд┐рдП:
ServiceWorkerModule.register('ngsw-worker.js', {enabled: environment.production})
рдЙрдкрд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╣рдорд╛рд░рд╛ рдкрд░реНрдпрд╛рд╡рд░рдг, рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдФрд░ рдЕрдореВрд░реНрдд рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрджрд╛рд╣рд░рдг
рддреЛ рдПрдУрдЯреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдПрдХ рдХрд╛рд░реНрдп рд╣реИ, рдФрд░ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ: Function calls are not supported in decorators but ..

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

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

// default.env.ts
interface ImplementThis {
  static propToImplement: boolean;
}

class DefaultEnv {
  public static production: boolean = false;
}

// my.env.ts
class Env extends DefaultEnv implements ImplementThis {
  public static propToImplement: true;
}

export const environment = Env;

рдЕрдореВрд░реНрдд рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рдХреЗ рд╕рд╛рде рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

// default.env.ts
export abstract class AbstractDefaultEnv {
  public static production: boolean = false;
  public abstract static propToImplement: boolean;
}
// my.env.ts
class Env extends AbstractDefaultEnv {
  public static propToImplement: true;
}

export const environment = Env;

рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╕рднреА рдХрдордЬреЛрд░ рд╣реИрдВ: /

@DanielRosenwasser @RyanCavanaugh рдЙрд▓реНрд▓реЗрдЦреЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╕реБрдЭрд╛рд╡ - рдЬрд┐рд╕реЗ рд╕рдореБрджрд╛рдп рд╕реЗ рдмрд╣реБрдд рд╕рдорд░реНрдерди рдкреНрд░рд╛рдкреНрдд рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ - рдореБрджреНрджреЛрдВ рдХреА рд╢реНрд░реЗрдгреА рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рджрдлрди рд╣реЛ рдЧрдпрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рд╣реИ, рдФрд░ рдХреНрдпрд╛ рдХрд┐рд╕реА рдЬрдирд╕рдВрдкрд░реНрдХ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?

рдХреНрдпрд╛ рдпрд╣ рд╕рдорд╕реНрдпрд╛ #1263 рдХрд╛ рдбреБрдкреНрд▓реАрдХреЗрдЯ рдирд╣реАрдВ рд╣реИ? рдореИрдВ

26398 (рдЯрд╛рдЗрдк рдЪреЗрдХ рд╕реНрдЯреИрдЯрд┐рдХ рдореЗрдореНрдмрд░реНрд╕ рдЬреЛ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреНрд╕ рдЯрд╛рдЗрдк рдХреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкреНрд░реЙрдкрд░реНрдЯреА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ) рдПрдХ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ ... рдЕрдЧрд░ рдРрд╕рд╛ рдХреБрдЫ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛ рддреЛ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╣реА рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕/рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред рдпрд╣ рдЙрддрдиреЗ рд╕рд╡рд╛рд▓ рднреА рдирд╣реАрдВ рдЙрдард╛рддрд╛, рдЬрд┐рддрдирд╛ рдпрд╣ рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╕реНрдерд┐рд░ рддрд░реАрдХреЗ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧреЛрдВ рдкрд░ рд╕реНрдерд┐рд░ рд╕рд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИрдВред

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

рдЙрджрд╛рд╣рд░рдг:

abstract class MyAbstractClass {
  static abstract bar(): number;
}

class Foo extends MyAbstractClass {
  static bar() {
    return 42;
  }
}

рдЕрднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдмрд╛рд╣рд░ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ

abstract class MultiWalletInterface {

  static getInstance() {} // can't write a return type MultiWalletInterface

  static deleteInstance() {}

  /**
   * Returns new random  12 words mnemonic seed phrase
   */
  static generateMnemonic(): string {
    return generateMnemonic();
  }
}

рдпрд╣ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ!

рдореИрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдерд╛ рдЬрд╣рд╛рдБ рдореИрдВ "рдСрдмреНрдЬреЗрдХреНрдЯ" рдореЗрдВ рдЧреБрдг рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдБ, рдпрд╣рд╛рдБ рдПрдХ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдЙрджрд╛рд╣рд░рдг рд╣реИ

interface Object {
    getInstanceId: (object: any) => number;
}

Object.getInstanceId = () => 42;
const someObject = {};
Object.getInstanceId(someObject); // correct
someObject.getInstanceId({}); // should raise an error but does not

рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рдЕрдм рд╕рдВрдкрддреНрддрд┐ getInstanceId рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдХреЗрд╡рд▓ Object рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рд╕реНрдерд┐рд░ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде, рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реЛрдЧреАред

рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдмрдврд╝рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдирд╣реАрдВред рдЖрдк рдПрдХ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╡рд┐рдзрд┐ рдШреЛрд╖рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрдм рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдПрдХ рд╡рд┐рдзрд┐ рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдШреЛрд╖рдгрд╛ рд╡рд┐рд▓рдп рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрднрд╡ рд╣реИ:

```` рдЯреАрдПрд╕
рд╡реИрд╢реНрд╡рд┐рдХ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ {
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ {
рд╣реИрд▓реЛ (): рд╕реНрдЯреНрд░рд┐рдВрдЧ;
}
}

рдСрдмреНрдЬреЗрдХреНрдЯ.рд╣реИрд▓реЛ ();
````

@thw0rted рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рдерд╛

рдмрдбрд╝рд╛ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЗрдВрд╕реНрдЯреЗрдВрд╕-рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдЬрд╛рдп рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░-рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрдврд╝рд╛ рд░рд╣реЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЕрднреА Object рдореЗрдВ lib.es5.d.ts $ рдШреЛрд╖рдгрд╛ рдХреЛ рджреЗрдЦрд╛ рдФрд░ рдкрд╛рдпрд╛ рдХрд┐ рдпрд╣ ObjectConstructor рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИред

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

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

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

рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

interface DeserializingClass<T> {
    fromJson(serializedValue: string): T;
}

interface Serializable {
    toJson(): string;
}

class Foo implements Serializable metaclass DeserializingClass<Foo> {
    static fromJson(serializedValue: string): Foo {
        // ...
    }

    toJson(): string {
        // ...
    }
}

// And an example of how this might be used:
function saveObject(Serializable obj): void {
    const serialized: string = obj.toJson();
    writeToDatabase(serialized);
}

function retrieveObject<T metaclass DeserializingClass<T>>(): T {
    const serialized: string = getFromDatabase();
    return T.fromJson(serialized);
}

const foo: Foo = new Foo();
saveObject(foo);

const bar: Foo = retrieveObject<Foo>();

рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдпрд╣ рдПрдХ рд╕рд╛рд░реНрдердХ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ-рд╡рд╛рдИ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдЖ рд░рд╣рд╛ рд╣реЛрдЧрд╛ metaclass ... staticimplements , classimplements , withstatic , implementsstatic ... рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИред

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

рдЖрдЗрдП #34516 рдФрд░ #33892 рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдХрд┐рд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕