ΠΠ΅ΡΡΠΈΡ 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
), ΠΊΠΎΡΠΎΡΡΠΉ _ΡΠ°ΡΡΠΈΡΡΠ΅Ρ_ ΠΊΠ»Π°ΡΡ ΠΈΠ· ΡΡΠΎΡΠΎΠ½Π½Π΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ. ΠΠ»Π°ΡΡ ΠΈΠ· ΡΡΠΎΡΠΎΠ½Π½Π΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅. ΠΠΎΠ³Π΄Π° Ρ Π½Π°Π·Π½Π°ΡΠ°Ρ ΡΠ²ΠΎΠΉ ΠΊΠ»Π°ΡΡ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΡΠΌ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΌ ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΠΎΠΌ, Ρ Π½Π΅ Ρ
ΠΎΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π»Ρ ΡΡΠΎΡΠΎΠ½Π½Π΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ (ΠΊΠ°ΠΊ ΡΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ Ρ new (name: string) => GenericGroup<CheckboxValues>;
), ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Ρ ΠΈΡ
Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Ρ.
(ΠΠ°ΠΆΠ΅ΡΡΡ, Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, Π½ΠΎ Ρ Π½Π΅ ΡΠΌΠΎΠ³ Π½Π°ΠΉΡΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ.)
ΠΠΏΠ΅ΡΠ°ΡΠΎΡ typeof ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π½Π΅ Π΄Π»Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΡΠΈΠΏΠ°, Π° Π΄Π»Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠΈΠΏΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΡ. 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:
// angular/packages/core/src/type.ts
export interface Type<T> extends Function {
new (...args: any[]): T;
}
ΠΈΠ· ( angular / packages / core / 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
), ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠ½Π΅ Π½ΡΠΆΠ½ΠΎ Π²ΡΡΡΠ½ΠΈΡΡ, ΠΊΠ°ΠΊ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΡΡΠ΄Π° Π²Π°ΡΠΈ ΠΎΡΠ·ΡΠ²Ρ. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ.
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
ΠΠΏΠ΅ΡΠ°ΡΠΎΡ typeof ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π½Π΅ Π΄Π»Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΡΠΈΠΏΠ°, Π° Π΄Π»Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠΈΠΏΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΡ. SomeGenericΠ½Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΡΠΎ ΡΠΈΠΏ ΡΠ°ΠΌ ΠΏΠΎ ΡΠ΅Π±Π΅. ΠΡΠ±ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ / ΡΠΈΠΏ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ Π½ΠΈΠΆΠ΅) ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΡΠΎΠ³ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π΄Π»Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠ², ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ Angular:
ΠΈΠ· ( angular / packages / core / src / type.ts )
ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ: