Typescript: рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдкреЛрдлрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

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

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд╕реНрдХрд░рдг: рд╡рд░реНрддрдорд╛рди рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд╕рдВрд╕реНрдХрд░рдг (?)

рдХреЛрдб

class GenericGroup<T> {
  items: Array<T> = [];
  constructor(name: string) {}
}

type CheckboxValues = string;
type CheckboxesGroup = new (name: string) => GenericGroup<CheckboxValues>;
const Checkboxes: CheckboxesGroup = GenericGroup;
const checkboxes = new Checkboxes('checkboxes');
checkboxes.items.map(item => item.toUpperCase());


type RadioValues = string;
type RadiosGroup = typeof GenericGroup<RadioValues>;
const Radios: RadiosGroup = GenericGroup;
const radios = new Radios('radios');
radios.items.map(item => item.toUpperCase());

рд╕рдВрдкрд░реНрдХ

рдЕрдкреЗрдХреНрд╖рд┐рддреН рд╡реНрдпрд╡рд╣рд╛рд░:

typeof GenericGroup<RadioValues>; new (name: string) => GenericGroup<RadioValues>; рдмрд░рд╛рдмрд░ рд╣реИ

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░:

рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐, рдХреНрдпреЛрдВрдХрд┐ typeof GenericGroup<RadioValues>; рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред

рдкреНрд░реЗрд░рдгрд╛:

рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЬреЗрдиреЗрд░рд┐рдХ (рдЬреИрд╕реЗ GenericGroup ) рд╡рд░реНрдЧ рд╣реИ, рдЬреЛ _extends_ рдПрдХ 3rd рдкрд╛рд░реНрдЯреА рдХреЗ рджрд╛рдпрд┐рддреНрд╡ рд╕реЗ рдПрдХ рд╡рд░реНрдЧ рд╣реИред рддреАрд╕рд░реА рдкрд╛рд░реНрдЯреА рдХреЗ рд▓рд┐рдм рд╕реЗ рд╡рд░реНрдЧ рдЕрдкрдиреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХрдИ рдкрд╛рд░рд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЬрдм рдореИрдВ рднрд░реА рд╣реБрдИ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдЙрд░реНрдл тАЛтАЛрдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рд╣рд░ рдмрд╛рд░ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкрд░рд┐рд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ (рдЬреИрд╕рд╛ рдХрд┐ new (name: string) => GenericGroup<CheckboxValues>; ) рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдП рдирд╣реАрдВ рд░рдЦрддрд╛ред

(рдХрдИ рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЗ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдорд┐рд▓реАред)

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

'рдЯрд╛рдЗрдкрдСрдлрд╝' рдСрдкрд░реЗрдЯрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╣реИред SomeGenericрдПрдХ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИред рдХреЛрдИ рднреА рдЕрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ / рдкреНрд░рдХрд╛рд░ (рдЬреИрд╕реЗ рдиреАрдЪреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдЗрд╕ рддрд░рд╣ рд╕реЗ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

interface MyInterface {
    name: string;
}

let m: typeof MyInterface; // error "MyInterface only refers to a type, but is being used as a value here."

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

// angular/packages/core/src/type.ts

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

рд╕реЗ ( рдХреЛрдгреАрдп / рд╕рдВрдХреБрд▓ / рдХреЛрд░ / src / type.ts )

рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:

type RadioValues = string;
type RadiosGroup = Type<GenericGroup<RadioValues>>;
const Radios: RadiosGroup = GenericGroup;
const radios = new Radios('radios');
radios.items.map(item => item.toUpperCase());

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

'рдЯрд╛рдЗрдкрдСрдлрд╝' рдСрдкрд░реЗрдЯрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╣реИред SomeGenericрдПрдХ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИред рдХреЛрдИ рднреА рдЕрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ / рдкреНрд░рдХрд╛рд░ (рдЬреИрд╕реЗ рдиреАрдЪреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдЗрд╕ рддрд░рд╣ рд╕реЗ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

interface MyInterface {
    name: string;
}

let m: typeof MyInterface; // error "MyInterface only refers to a type, but is being used as a value here."

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

// angular/packages/core/src/type.ts

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

рд╕реЗ ( рдХреЛрдгреАрдп / рд╕рдВрдХреБрд▓ / рдХреЛрд░ / src / type.ts )

рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:

type RadioValues = string;
type RadiosGroup = Type<GenericGroup<RadioValues>>;
const Radios: RadiosGroup = GenericGroup;
const radios = new Radios('radios');
radios.items.map(item => item.toUpperCase());

рдПрдХ рд╕реВрдХреНрд╖реНрдо рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╢реНрд░реЗрдгреА рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВ ред рдЖрдк рдпрд╣ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЪреВрдВрдХрд┐ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрдерд┐рд░ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ! рдпрд╣ "рдорд╣рд╕реВрд╕" рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ

interface GenericCtor<T> {
  new(x: string): InstanceType<T>;
}

рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдЗрд╕ рддрд░рд╣ рд╣реИ

interface GenericCtor {
  new<T>(x: string): InstanceType<T>;
}

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

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

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

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

kyasbal-1994 picture kyasbal-1994  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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

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

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