Typescript: рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЗрдВрдЯрд░рдлреЗрд╕ рдЬреЛрдбрд╝реЗрдВ

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

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд╕реНрдХрд░рдг: 2.0.3

рдХреЛрдб

interface Foo {
public static myStaticMethod(param1: any);
}

рдЕрдкреЗрдХреНрд╖рд┐рддреН рд╡реНрдпрд╡рд╣рд╛рд░:
рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдирд╣реАрдВ
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░:
рдЕрд╕рдорд░реНрдерд┐рдд

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

@aluanhaddad рдореБрдЭреЗ рдЖрдкрдХрд╛ рдХреЛрдб рдХреБрдЫ рдРрд╕реА рдЪреАрдЬрд╝ рдХрд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд▓рдЧрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд╣реИред

interface JsonSerializable {
      public static fromJson(obj: any);
      public toJson(): string;
}

рдЬрд┐рд╕реЗ рдЖрдк рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ?

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

рдЗрд╕рд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдЖрдк рдкрд░рд┐рджреГрд╢реНрдп рдкрд░ рд╡рд┐рд╕реНрддреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ abstract рдХреНрд▓рд╛рд╕реЗрд╕ рд╡рд╣реА рд╣реИрдВ рдЬреЛ рдЖрдк рдвреВрдВрдв рд░рд╣реЗ рд╣реИрдВред

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

interface JsonSerializable {
      public static fromJson(obj: any);
      public toJson(): string;
}

@rozzzly рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, abstract class рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛! рдЬрд╛рд╡рд╛ рдиреЗ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рд╛ред

@Serginho
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ:

interface JsonSerializableStatic<C extends new (...args) => JsonSerializable<C>> {
  fromJson(json: string): JsonSerializable<C>;
}

interface JsonSerializable<C extends new (...args) => any> {
  toJson: () => string;
  constructor: C;
}

interface A extends JsonSerializable<typeof A> { }
class A implements JsonSerializable<typeof A> {

  constructor(readonly id: number, readonly name: string) { }
  toJson() { return JSON.stringify(this); }

  static fromJson(json: string): A {
    const obj = JSON.parse(json);
    return new A(obj.id, obj.name);
  }
}

const a = new A(1, 'Charlize');

const json = a.toJson();

const y = A.fromJson(json);
console.info(a, json, y);
console.info(new a.constructor(1, 'Theron'));
const m = new A.prototype.constructor(1, 'Charlize Theron');
console.info(m);

@aluanhaddad рдореБрдЭреЗ рдЖрдкрдХрд╛ рдХреЛрдб рдХреБрдЫ рдРрд╕реА рдЪреАрдЬрд╝ рдХрд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд▓рдЧрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд╣реИред

interface JsonSerializable {
      public static fromJson(obj: any);
      public toJson(): string;
}

рдЬрд┐рд╕реЗ рдЖрдк рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ?

@aluanhaddad рдореБрдЭреЗ рдЖрдкрдХрд╛ рдХреЛрдб рдХреБрдЫ рдРрд╕реА рдЪреАрдЬрд╝ рдХрд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд▓рдЧрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд╣реИред

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ JsonSerializable {
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХрдЬрд╕рди (obj: any) рд╕реЗ;
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ toJson (): рд╕реНрдЯреНрд░рд┐рдВрдЧ;
}
рдЬрд┐рд╕реЗ рдЖрдк рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ?

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдПрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЖрдкрдХреЗ usecase рдХрд╛ рдФрдЪрд┐рддреНрдп рд╣реИред рд╕реНрдереИрддрд┐рдХ deserialization рдФрд░ рдЙрджрд╛рд╣рд░рдг serialization рдПрдХ рд╡рд░реНрдЧ рдкрд░ рд╡рд░реНрдЧ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕рдордЭрд╛рдпрд╛ рдФрд░ рдкреНрд░рдХрд╛рд░ рд╣реИред
рдЖрдкрдХреА рдШреЛрд╖рдгрд╛:

interface JsonSerializable {
     public static fromJson(obj: any);
     public toJson(): string;
}

рдпрд╣ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕реНрдерд┐рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдЦреЛ рд░рд╣реЗ рд╣реИрдВред class A implements JsonSerializable рдореБрдЭреЗ рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рддрд╛ рд╣реИ:

toJson: () => string;
constructor: new (...args) => JsonSerializableStatic<C>;

рдпрд╣ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред

рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░ рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рддрдХрдиреАрдХреА рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред

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

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

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

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

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

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

import assert = require("assert");

interface JsonSerializableStatic<JsonType, InstanceType extends JsonSerializable<JsonType>> {
    fromJson(obj: JsonType): InstanceType;
}
interface JsonSerializable<JsonType> {
    toJson(): JsonType;
}

interface PointJson { x: number; y: number; }
class Point /*static implements JsonSerializableStatic<PointJson, Point>*/ {
    static fromJson(obj: PointJson): Point {
        return new Point(obj.x, obj.y)
    }

    constructor(readonly x: number, readonly y: number) {}

    toJson(): PointJson {
        return { x: this.x, y: this.y };
    }
}
// Hack for 'static implements'
const _: JsonSerializableStatic<PointJson, Point> = Point;

function testSerialization<JsonType, InstanceType extends JsonSerializable<JsonType>>(cls: JsonSerializableStatic<JsonType, InstanceType>, json: JsonType) {
    const instance: InstanceType = cls.fromJson(json);
    const outJson: JsonType = instance.toJson();
    assert.deepEqual(json, outJson);
}
testSerialization(Point, { x: 1, y: 2 });

рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдореЗрдВ toJson рдпрд╛ fromJson рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ред (рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╡рд┐рдзрд┐ рдХреЗ рдмрдЬрд╛рдп рддреНрд░реБрдЯрд┐ const _ ред)

рд╕рдВрднрд╡рддрдГ рд╕рдВрдмрдВрдзрд┐рдд (рдЪреВрдВрдХрд┐ рдпрд╣ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ): # 5863ред


@aluanhaddad : рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рдЧрд▓рддреА рд╣реИ: JsonSerializable constructor рд╕рджрд╕реНрдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ constructor рдирд╛рдордХ рдПрдХ рдкреНрд░реЙрдкрд░реНрдЯреА рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ new рд╕рд╛рде рдЖрд╣реНрд╡рд╛рди рдХрд░рдиреЗ рдкрд░ JsonSerializableStatic ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ (new ((new X()).constructor)).fromJson({}) рдХреЛ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ interface A extends JsonSerializable<typeof A> рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЬрд╛рдБрдЪ рдХреЗ рдмрд┐рдирд╛ рдорд╛рдиреНрдп рд╣реЛрдиреЗ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдХрд▓рд┐рдд рд╣реИ:

interface I { m(): void; }
interface A extends I { }
// No compile error
class A implements I { em() {} }

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

interface I { ... }
namespace I {
   export function interfaceStaticMethod() {}
}

рдпрджрд┐ рдЖрдк рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдлреИрдХреНрдЯрд░реА рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?

interface Factorizable {
  static factory<U>(str: string): U
}

class Foo {
  private data: string[] = []
  bar<T extends Factorizable>(): T[] {
    return this.data.map(T.factory);
  }
}

class Bar implements Factorizable {
  static factory(str: string): Bar {
    // ...
  }
}

// Usage
var x = new Foo();
var y: Bar[] = x.bar();

рдореИрдВ рдпрд╣рд╛рдБ interface рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдБ рдЬреЛ рдореИрдВ рдпрд╣рд╛рдБ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ "рдЙрдкрдпреЛрдЧ" рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд╣реА рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдпрд╣ рдПрдХ рдРрд╕рд╛ рдкреИрдЯрд░реНрди рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдЕрдХреНрд╕рд░ рд╕реНрд╡рд┐рдлреНрдЯ ( protocols рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рднрд╛рд╖рд╛ рдбрд┐рдЬрд╛рдЗрдирд░ рдпрд╛ рд╕рдВрдХрд▓рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЗрдЪреНрдЫрд┐рдд рджрд┐рд╢рд╛ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ рдпрд╛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрдерд╛рд░реНрдерд╡рд╛рджреА рд╣реИред

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

interface Factorizable<U> {
    factory(str: string): U
}

class Foo {
  private data: string[] = []
  bar<T>(factory: Factorizable<T>): T[] {
    return this.data.map(factory.factory);
  }
}

class Bar {
  static factory(str: string): Bar {
    // ...
  }
}

// Usage
var x = new Foo();
var y = x.bar(Bar); // Bar[]

@mhegazy рдЬреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! ЁЯЩП

рдЕрднреА рднреА рджреЛ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рдЕрд╕реБрд╡рд┐рдзрд╛ рджреЗрддреА рд╣реИрдВ (рдЖрдорддреМрд░ рдкрд░ рди рддреЛ рд╢реЛ рд╕реНрдЯреЙрдкрд░реНрд╕ рд╣реИрдВ):

  1. рд╣рдо рдЕрднреА рднреА рдЙрд╕ Bar рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИрдВ рдпрд╛ Factorizable рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИрдВред

    • рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдЪреВрдБрдХрд┐ рдпрд╣ рд╕рдЪ рд╣реЛрдЧрд╛ рдХрд┐ рдпрджрд┐ Factorizable рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрд╕рдВрдЧрдд рддрд░реАрдХреЗ рд╕реЗ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЙрдкрдпреЛрдЧ x.bar(Bar) рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рд▓рдЧреЗрдЧреА рдФрд░ рдлрд┐рд░ рдЖрдк рдмрд╣рд╛рд╡ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдареАрдХ рдХрд░ рд▓реЗрдВрдЧреЗред
  2. рдореЗрд░реЗ рд▓рд┐рдП, рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рджрд╛рдИрдВ рдУрд░ y рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдирд╛ рдЕрднреА рднреА рдПрдХ рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рдмреЛрдЭ рд╣реИред

    • рд╡рд╛рдЗрдбрд░ рдЕрднреА рднреА рдЗрд╕ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдЧрд╛: var y: Baz[] = x.bar(Bar) ред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдПрдХ рддреНрд░реБрдЯрд┐, рд▓реЗрдХрд┐рди рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЕрдзрд┐рдХ-рд╡рд┐рд╡рд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред

рд╣рдо рдЕрднреА рднреА рдЙрд╕ рдмрд╛рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИрдВ рдпрд╛ рдХрд╛рд░рдХ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИрдВред

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

рдореЗрд░реЗ рд▓рд┐рдП, рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рджрд╛рдИрдВ рдУрд░ y рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдЕрднреА рднреА рдПрдХ рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рдмреЛрдЭ рд╣реИред

рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬреЛрдВ рдХрд╛ рдорддрд▓рдм рд╣реИ, var y = x.bar(Bar) рдПрдХ рдирдпрд╛ рдЪрд░ y x.bar(Bar) рдХреЗ рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ; рдЬрд╣рд╛рдБ var y: Bar[] = x.bar(Bar) рдПрдХ рдирдП рд╡реИрд░рд┐рдПрдмрд▓ y рдХреЛ Bar[] y рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ рдХрд┐ x.bar(Bar) рдХрд╛ рдкреНрд░рдХрд╛рд░ Bar[] ред

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

@mhegazy рдЪрд░реНрдЪрд╛ / рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

@ -y-hanson рдореБрдЭреЗ рд╕рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ред

рдпрд╣ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд╕рдВрдХрд▓рди рд╕рдордп рдореЗрдВ рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

interface Type<T> {
    new (...args: any[]): T;
}

/* static interface declaration */
interface ComparableStatic<T> extends Type<Comparable<T>> {
    compare(a: T, b: T): number;
}

/* interface declaration */
interface Comparable<T> {
    compare(a: T): number;
}

/* class decorator */
function staticImplements<T>() {
    return (constructor: T) => {}
}

@staticImplements<ComparableStatic<TableCell>>()   /* this statement implements both normal interface & static interface */
class TableCell { /* implements Comparable<TableCell> { */  /* not required. become optional */
    value: number;

    compare(a: TableCell): number {
        return this.value - a.value;
    }

    static compare(a: TableCell, b: TableCell): number {
        return a.value - b.value;
    }
}

рдЪрд░реНрдЪрд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реИ?

рдореИрдВ рдЗрд╕рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ рдФрд░ рдореИрдВ static interface рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

interface IDb {
  public static instance: () => Db,
}

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

interface MyFoo {
  method(): void;
}

interface MyFooConstructor {
  new (): MyFoo;
  prototype: MyFoo;
  staticMethod(): any;
}

const MyFoo = function MyFoo() {
  this.prop = '';
} as any as MyFooConstructor;

MyFoo.prototype = {
  method() { console.log(this); }
}

MyFoo.staticMethod = function () { /* do something static */ }

рдпрджрд┐ рдЖрдк _abstract_ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢рдХреНрддрд┐ рд╣реИред

рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП @kitsonk рдХрд╛ рд╢реБрдХреНрд░рд┐рдпрд╛ред

рдЖрдкрдХрд╛ рдШреЛрд╖рдгрд╛рдкрддреНрд░ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдФрд░ рдореИрдВрдиреЗ рд╕рд┐рд░реНрдл _abstract_ рдХреНрд▓рд╛рд╕реЗрд╕ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдпрд╣ static abstract рд╕рд╛рде рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ред

[ts] 'static' modifier cannot be used with 'abstract' modifier.

@ рдЬрд╝рд┐рдХреНрд╕рд┐рдпрд╛ рдЬреЛ # 14600 рдЬрд╛рд░реА рд╣реИ

рд╣рд╛рдБ, рдЗрд╕реЗ рд╡реЛрдЯ рджреЗрдВред

рдХрд┐рд╕реА рдХреЛ рдореЗрд░реЗ рд╕рд╡рд╛рд▓ рдХрд╛ рд╣рд▓ рдХреЗ рд╕рд╛рде рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдзреНрдпрд╛рди рджреЗрдВ: http://stackoverflow.com/questions/44047874/dynamically-modify-typescript-classes-through-a-generic-function

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

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

@ Enet4 рдореИрдВрдиреЗ рд╕рд╡рд╛рд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛, рдпрд╣ рдЕрддреНрдпрдзрд┐рдХ рд╕рд░рд▓ рдерд╛ред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореБрджреНрджрд╛ Object.defineProperty() рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреЛ btw, рдПрдХ рд╣реИрдХ рд╣реИред рдореИрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рдЙрдЪрд┐рдд рд╕реНрдереИрддрд┐рдХ рдЬрд╛рдБрдЪ - make рдЧрд▓рдд рд╡рд░реНрддрдиреА рдирд╣реАрдВ рд╣реЛрдиреЗ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред

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

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

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

@ Enet4 рдпрд╣ рдПрдХ

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

@grantila рдореЗрд░реЗ рдмрдЪрд╛рд╡ рдореЗрдВ, рдпрд╣ рдмрд╣рд╕ рдХрд╛ рдореБрджреНрджрд╛ рд╣реИред : рд╡рд┐рдВрдХ: рдЖрдкрдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдЗрд╕ рдЕрдВрдХ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЧрдП рд▓реЛрдЧреЛрдВ рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдЗрд╕рдореЗрдВ рдЖрдкрдХреЗ рд╡рд░реНрдЧ рдкреНрд░рдХрд╛рд░ рд░рдирдЯрд╛рдЗрдо рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛ рдирд╣реАрдВ)ред рдФрд░ IMO рдЬреЛ рдореЗрд░реЗ рдЙрддреНрддрд░ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рдореНрдорд┐рд▓рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╡рд░реНрдЧ рдЯрд╛рдЗрдк C & Maker<T> рд╕рдм рдХреБрдЫ рдПрдХ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП C ред

рдореИрдВрдиреЗ рдпрд╣ рднреА рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╕реНрдерд┐рд░ рддрд░реАрдХреЗ рдпрд╣рд╛рдБ рдЖрдкрдХреА рдорджрдж рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ static make?(... args: any[]): self рдЬреИрд╕рд╛ рдХреБрдЫ рдерд╛, рддреЛ рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдк рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдЗрдП рд╢реЛрд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рдФрд░ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред : Slightly_smiling_face:

рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╕реНрдЯреИрдЯрд┐рдХ рдлрд╝реИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдЬреЛ рд╕рдорд╛рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ?

рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИ:

interface IObject {
    static make(s: string): IObject;
}

class A implements IObject{
    static make(s: string): IObject {
        // Implementation A...
    }
}

class B implements IObject{
    static make(s: string): IObject {
        // Implementation B...
    }
}

A.make("string"); // returns A
B.make("string"); // returns B

рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдХрд╛рд░рдЦрд╛рдирд╛ рд╡рд░реНрдЧ рдирд╣реАрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ред

@ tyteen4a03 рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рд╕реЗ IObject рдирд┐рдХрд╛рд▓реЗрдВ, рдФрд░ рдпрд╣ рд╕рдВрдХрд▓рди рдХрд░реЗрдЧрд╛ред Https://github.com/Microsoft/TypeScript/issues/17545#issuecomment -319422545 рднреА рджреЗрдЦреЗрдВ

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

рд╣рд╛рдВ рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ .. рдЪреЗрдХ рдкреНрд░рдХрд╛рд░ рд╣реИред

рдпрд╣ рдПрдХ рд▓рдВрдмрд╛ рд▓рдВрдмрд╛ рдереНрд░реЗрдб рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╡рд░реНрдЧ рдХрд╛ рд╕реНрдерд┐рд░ рдкрдХреНрд╖ рдЙрджрд╛рд╣рд░рдг рдкрдХреНрд╖ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдкрдХреНрд╖ рдореЗрдВ implements рдЕрдВрдХ рд╣реИред @ @ -y -ms

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

class RepositoryMixin<T> {
    public static repository(): EntityRepository<T> {
        return new EntityRepository<T>(Object.getPrototypeOf(this));
    }
}

@mixin(RepositoryMixin)
class Entity implements RepositoryMixin<Entity> {
    public id: number;
}

Entity.repository().save(new Entity());

@rmblstrp рдХреНрдпрд╛ рдЖрдк рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ? рдЕрдзрд┐рдорд╛рдирддрдГ рдХреБрдЫ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ?

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

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

рдпреЗ рдРрд╕реА рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдкреВрд░реА рдЪреАрдЬ рдХреЛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред
https://github.com/Deviad/virtual-life/blob/master/models/generic.ts
https://github.com/Deviad/virtual-life/blob/master/service/user.ts
https://github.com/Deviad/virtual-life/blob/master/models/user.ts
https://github.com/Deviad/virtual-life/blob/master/utils/sqldb/client.ts
https://github.com/Deviad/virtual-life/blob/master/bootstrap.ts

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕ рд╡реАрдбрд┐рдпреЛ рдХреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕ рдкрд╣рд▓реВ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдмреЗрд╣рддрд░ рд╣реИ: https://www.youtube.com/watch?v=e-5obm1G_FY&t=1487s
рдЬрд╛рд╕реВрд╕: рдХреЛрдИ рднреА рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ, рдХрдХреНрд╖рд╛рдУрдВ, рд╢рд┐рдХреНрд╖рдХреЛрдВ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ OOP рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдореЙрдбрд▓ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред
рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдРрд╕реЗ рдкрд╛рд░реНрд╕рд░ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЬреЛ рдХрд┐рд╕реА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЛ рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реЛ рддреЛ рдлрдВрдХреНрд╢рдирд▓ рдЬрдирд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЖрдВрд╢рд┐рдХ рдкрд░рд┐рдгрд╛рдо рджреЗрддреЗ рд╣реИрдВ, рдЖрджрд┐ :)

@Deviad @aluanhaddad рдЕрдкрдиреА рдкреЛрд╕реНрдЯ рдХреЗ рдмрд╛рдж рд╕реЗ рдореИрдВ InversifyJS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╢рд╛рдирджрд╛рд░ рд╣реИ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИред рдЕрдкрдиреА рдкреЛрд╕реНрдЯ рдХреЗ рд╕рдордп рдореИрдВрдиреЗ PHP / C # рдкрд╣рд▓реЗ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕рд┐рд░реНрдл рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ / рдиреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛ред рдкрд░реНрдпрд╛рд╡рд░рдг рдФрд░ рдЙрдкрд▓рдмреНрдз рдкреИрдХреЗрдЬ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдореЗрдВ рдЕрднреА рдереЛрдбрд╝рд╛ рд╕рдордп рд▓рдЧрд╛ рд╣реИред

рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИ? рдЖрдк рд░реЗрдкреЛ рдореЗрдВ рдЕрдирд╕реБрд▓рдЭреЗ рдореБрджреНрджреЛрдВ рдХреЛ рдмрдВрдж рдХреНрдпреЛрдВ рд░рдЦрддреЗ рд╣реИрдВ?

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

@ enet4 , рдореИрдВ рдПрдХ рдирд╡рд╛рдЧрдВрддреБрдХ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ред рдЗрд╕реЗ рдФрд░ рдЕрдиреНрдп рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ рдХреЛ рдкрдврд╝рддреЗ рд╣реБрдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬреНрдпрд╛рджрд╛рддрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореБрджреНрджреЗ рд╣реИрдВ:

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

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

рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ # 14600 рд▓рд┐рдВрдХ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХрд╛ рдореБрджреНрджрд╛ рд╣реИред

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

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

manekinekko picture manekinekko  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

siddjain picture siddjain  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

CyrusNajmabadi picture CyrusNajmabadi  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

uber5001 picture uber5001  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

DanielRosenwasser picture DanielRosenwasser  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ