рдирд┐рд░рдВрддрд░рддрд╛ #2947 рдЕрдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдЬреЛ рд╡рд┐рдзрд┐ рдШреЛрд╖рдгрд╛рдУрдВ рдкрд░ abstract
рд╕рдВрд╢реЛрдзрдХ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛рдУрдВ рдкрд░ рдЗрд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рд╡рд┐рдзрд┐ рдШреЛрд╖рдгрд╛рдУрдВ рдкрд░ abstract static
рд╕рдВрд╢реЛрдзрдХ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдХрд░ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛рдУрдВ рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВред .
рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╕реНрдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдкрд░ static
рд╕рдВрд╢реЛрдзрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЬрд┐рд╕рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред
рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдФрд░ рдЙрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореБрдЭреЗ рдХреБрдЫ рд╡рд░реНрдЧ-рдирд┐рд░реНрднрд░ (рдЙрджрд╛рд╣рд░рдг-рдирд┐рд░реНрднрд░ рдирд╣реАрдВ) рдорд╛рди рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдмрд╛рд▓ рд╡рд░реНрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд╣реАрдВ), рдмрд┐рдирд╛ рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдирд╛ред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЬреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рд╡рд╣ рд╣реИ рд╡рд┐рдзрд┐ рдШреЛрд╖рдгрд╛ рдкрд░ 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' рдкреНрд░рдХрд╛рд░ 'рдЯрд╛рдЗрдкрдСрдлрд╝ рд╕рд╛рд░рдкреИрд░реЗрдВрдЯрдХреНрд▓рд╛рд╕' рдкрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред
рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрд░реНрдХ рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдкреВрд░реНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реВрдЪреА рд╣реЛ рдФрд░ рд╕рдЯреАрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реЛред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП (рдЙрджрд╛рд╣рд░рдг 3):
interface Serializable {
serialize(): string;
static deserialize(serializedValue: string): Serializable; // error: 'static' modifier cannot appear on a type member.
}
рдЗрд╕ рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ: 'рд╕реНрдерд┐рд░' рд╕рдВрд╢реЛрдзрдХ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рджрд╕реНрдп рдкрд░ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рджреЛрдиреЛрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ (1.1 рдФрд░ 1.2) рдХрд╛ рд╕рдорд╛рдзрд╛рди рдЕрдореВрд░реНрдд рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдШреЛрд╖рдгрд╛рдУрдВ рдкрд░ abstract
static
рд╕рдВрд╢реЛрдзрдХ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИред
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрдВрдЯрд░рдлреЗрд╕, рдЕрдореВрд░реНрдд рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐:
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб (рдЙрджрд╛рд╣рд░рдг 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));
abstract static
рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПabstract static
рдпрд╛ static
рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПstatic
рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПstatic
рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПabstract static
рд╕рдВрд╢реЛрдзрдХ рдХреЗ рдЕрдиреНрдп рд╕рднреА рдЧреБрдг abstract
рдФрд░ static
рд╕рдВрд╢реЛрдзрдХ рдЧреБрдгреЛрдВ рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред
static
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рдЕрдиреНрдп рд╕рднреА рдЧреБрдг рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ static
рд╕рдВрд╢реЛрдзрдХ рдЧреБрдгреЛрдВ рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред
abstract static
static
рд╕рдВрд╢реЛрдзрдХ рдФрд░ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ static рд╕рдВрд╢реЛрдзрдХ рд╣реИредabstract static
static
рд╕рдВрд╢реЛрдзрдХ рдФрд░ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ static рд╕рдВрд╢реЛрдзрдХ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВред рд╕реНрдЯреЗрдЯрд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЖрдо рддреМрд░ рдкрд░ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддреА рд╣реИрдВ, #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 рдФрд░ рдкрд╛рдпрдерди рдЬреИрд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдФрд░ рд╕рдлрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдирдпрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рднреА рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрддрдиреЗ рд╕рд╛рд░реЗ рд▓реЛрдЧ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рди рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдФрдЪрд┐рддреНрдп рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
рдПрдХ рдФрд░ рд╕рд░рд▓ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛: (рдЖрджрд░реНрд╢ рддрд░реАрдХрд╛, рдЬреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)
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
рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпреЗ рдЦрддрд░рдирд╛рдХ рд╕рдорд╛рдзрд╛рди рдЖрдкрдХреЛ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реНрдерд▓ рдкрд░ рдЖрдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗ (рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ), рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:
#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
```` рдЯрд╛рдЗрдкрдкреНрд░рддрд┐
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ {рд╕реНрдерд┐рд░ (рдП: рдП): рд▓рд╛рдЧреВ ; }
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_ рдХреЗ рдкрд╛рд╕ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕рдХреА рдЕрд╡рд╣реЗрд▓рдирд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВред рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдХрд┐ рдЕрдиреБрд░рдХреНрд╖рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ - рдкрд╡рд┐рддреНрд░ рд╕рд┐рджреНрдзрд╛рдВрдд (рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╡реЗ рдЗрд╕реЗ рд╕рдордЭрддреЗ рд╣реИрдВ), рдпрд╛ рд╕рдореБрджрд╛рдпред
рдпрд╛рд░, рдХреЛрдИ рднреА рдЕрдЪреНрдЫрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдХреБрдЫ рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рд╡реНрдпрдХреНрдд рдХреА рдФрд░ рдПрдХ рдкреНрд░рд╢реНрди рдкреВрдЫрд╛, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдпрд╣ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИ, рдЖрдк рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ
рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдХреЗ рд▓рд┐рдП рдЙрдмрд▓рд╛ рд╣реБрдЖ рд╣реИ: рдмрд╕ рдХрд╛рд░рдг, рд╣рд┐рдореНрдордд рдордд рдХрд░реЛ
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдареЛрд╕ рдпрд╛ рдКрдк рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рдмрдврд╝рд╛ рджрд┐рдпрд╛ рдерд╛, рдЖрдкрдиреЗ рдЗрд╕реЗ "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
рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?
рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдФрд░ рд╕реБрдЭрд╛рд╡ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧреА рдХреНрдпреЛрдВ рд╣реЛрдЧрд╛?
рд╢рд╛рдпрдж рд╣рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рджреЗрдЦрдиреЗ рдФрд░ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдБ рджреЛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИрдВ:
interface ISerializable<T> {
static fromJson(json: string): T;
}
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; }
рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛: рдЬреЗрдирд░реЗрдЯ рдХреЛрдб/рдЖрдВрд╢рд┐рдХ рд╡рд░реНрдЧ рд╢рд┐рдореНрд╕
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
рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕реБрд░рд╛рдЧ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдпрд╣ рд░рди рдЯрд╛рдЗрдо рдкрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реЛ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдЯрд╛рдЗрдк рдЪреЗрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдпрд╣рд╛рдВ рдЗрддрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдореМрдЬреВрдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрд╡рдпрдВ рд╕реНрдерд┐рд░ рдЪреАрдЬрд╝ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ ЁЯдФ
рд╕реНрдЯреЗрдЯрд┐рдХ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдХрднреА рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ
рдХреМрди рд╕реНрдЯреИрдЯрд┐рдХ рдореЗрдердб рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдпрд╛ рд╕реНрдЯреИрдЯрд┐рдХ рдлреАрд▓реНрдб рдХреЛ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ? рдореИрдВ
рдХреНрдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИ?ЁЯдФЁЯдФЁЯдФЁЯдФ
рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рдмрд┐рд▓реНрдХреБрд▓?
рдпрджрд┐ рдпрд╣ рдХреЛрдИ рдорджрдж рд╣реИ, рддреЛ рдореИрдВрдиреЗ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдХрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХрдХреНрд╖рд╛ рдореЗрдВ рд╕реНрдерд┐рд░ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдЬрд╛рд╡рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ
рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
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 рдХрд╛ рдбреБрдкреНрд▓реАрдХреЗрдЯ рдирд╣реАрдВ рд╣реИ? рдореИрдВ
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╕реНрдерд┐рд░ рддрд░реАрдХреЗ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧреЛрдВ рдкрд░ рд╕реНрдерд┐рд░ рд╕рд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдереЛрдбрд╝рд╛ рд╕реНрдХреЗрдЪреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрд▓рд╛рд╕ рдирд╣реАрдВред рджреВрд╕рд░реА рдУрд░, рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдерд┐рд░ рдЕрдореВрд░реНрдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрд╡рд░реНрдЧреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдореВрд░реНрдд рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ (рдЬреИрд╕реЗ 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 рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдХрд┐рд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореИрдВ Serializable рдХреЗ рдЙрдкрд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реНрдереИрддрд┐рдХ deserialize рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрд╛рдзреНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред
рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реИ?