рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд╕реНрдХрд░рдг: рд╡рд░реНрддрдорд╛рди рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд╕рдВрд╕реНрдХрд░рдг (?)
рдХреЛрдб
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());
рдПрдХ рд╕реВрдХреНрд╖реНрдо рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╢реНрд░реЗрдгреА рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВ ред рдЖрдк рдпрд╣ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЪреВрдВрдХрд┐ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрдерд┐рд░ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ! рдпрд╣ "рдорд╣рд╕реВрд╕" рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ
interface GenericCtor<T> {
new(x: string): InstanceType<T>;
}
рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдЗрд╕ рддрд░рд╣ рд╣реИ
interface GenericCtor {
new<T>(x: string): InstanceType<T>;
}
рдЖрдк рджреЛрдиреЛрдВ рдХреЛ рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЕрдкрдирд╛ рд╕рд┐рд░ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ рдПрдХ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ ( React.Component
) рд╕реЗ рдмрдврд╝рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдзрдиреНрдпрд╡рд╛рджред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
'рдЯрд╛рдЗрдкрдСрдлрд╝' рдСрдкрд░реЗрдЯрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╣реИред SomeGenericрдПрдХ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИред рдХреЛрдИ рднреА рдЕрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ / рдкреНрд░рдХрд╛рд░ (рдЬреИрд╕реЗ рдиреАрдЪреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдЗрд╕ рддрд░рд╣ рд╕реЗ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдЗрд╕рдХрд╛ рдПрдХ рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдПрдВрдЧреБрд▓рд░ рдЬреИрд╕реЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП:
рд╕реЗ ( рдХреЛрдгреАрдп / рд╕рдВрдХреБрд▓ / рдХреЛрд░ / src / type.ts )
рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг: