Typescript: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ typeof с ΠΎΠ±Ρ‰ΠΈΠΌ

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 15 Π΄Π΅ΠΊ. 2017  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: microsoft/TypeScript

ВСрсия 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());

ВсС 3 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ 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 ), поэтому ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚ΡƒΠ΄Π° ваши ΠΎΡ‚Π·Ρ‹Π²Ρ‹. Π‘Π»Π°Π³ΠΎΠ΄Π°Ρ€ΡŽ.

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ