Typescript: Gunakan typeof dengan generik

Dibuat pada 15 Des 2017  ·  3Komentar  ·  Sumber: microsoft/TypeScript

TypeScript Version: Versi taman bermain saat ini (?)

Kode

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());

tautan

Perilaku yang diharapkan:

typeof GenericGroup<RadioValues>; setara dengan new (name: string) => GenericGroup<RadioValues>;

Perilaku sebenarnya:

Galat sintaks, karena typeof GenericGroup<RadioValues>; tidak didukung.

Motivasi:

Dalam kasus penggunaan saya, saya memiliki kelas dengan generik (seperti GenericGroup ) yang _extends_ kelas dari lib pihak ketiga. Kelas dari lib pihak ketiga menggunakan beberapa parameter dalam konstruktornya. Ketika saya membuat alias kelas saya dengan generik yang terisi, saya tidak ingin menulis parameter untuk lib pihak ketiga setiap saat (seperti yang dilakukan dengan new (name: string) => GenericGroup<CheckboxValues>; ) karena saya tidak benar-benar memeliharanya.

(Tampaknya ada beberapa masalah terkait, tetapi saya tidak dapat menemukan masalah persis dengan masalah ini.)

Question

Komentar yang paling membantu

Operator 'typeof' tidak dimaksudkan untuk mendeskripsikan konstruktor suatu tipe, melainkan tipe dari suatu nilai. SomeGenericbukanlah sebuah nilai, ini adalah tipe dalam dan dari dirinya sendiri. Antarmuka / tipe lain (seperti yang didefinisikan di bawah) tidak akan bekerja dengan cara ini juga.

interface MyInterface {
    name: string;
}

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

Solusi untuk ini adalah dengan mendefinisikan tipe generik untuk mendeskripsikan konstruktor seperti yang dilakukan Angular:

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

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

dari ( sudut / paket / inti / src / type.ts )

Contoh penggunaan:

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

Semua 3 komentar

Operator 'typeof' tidak dimaksudkan untuk mendeskripsikan konstruktor suatu tipe, melainkan tipe dari suatu nilai. SomeGenericbukanlah sebuah nilai, ini adalah tipe dalam dan dari dirinya sendiri. Antarmuka / tipe lain (seperti yang didefinisikan di bawah) tidak akan bekerja dengan cara ini juga.

interface MyInterface {
    name: string;
}

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

Solusi untuk ini adalah dengan mendefinisikan tipe generik untuk mendeskripsikan konstruktor seperti yang dilakukan Angular:

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

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

dari ( sudut / paket / inti / src / type.ts )

Contoh penggunaan:

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

Hal yang halus adalah bahwa fungsi konstruktor kelas generik tidak terdapat dalam tipe generik . Anda dapat mengetahuinya karena parameter type tidak dalam cakupan untuk anggota statis! Ini "terasa" seperti Anda memiliki tipe seperti ini

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

tapi tipe aslinya seperti ini

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

Terima kasih semuanya. Aku perlu memikirkan ini. Dalam kasus saya, saya memperpanjang dari konstruktor pihak ketiga ( React.Component ) jadi saya perlu mencari cara untuk menerapkan umpan balik Anda di sana. Terima kasih.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

manekinekko picture manekinekko  ·  3Komentar

MartynasZilinskas picture MartynasZilinskas  ·  3Komentar

dlaberge picture dlaberge  ·  3Komentar

kyasbal-1994 picture kyasbal-1994  ·  3Komentar

wmaurer picture wmaurer  ·  3Komentar