Typescript: Verwenden Sie typeof mit generic

Erstellt am 15. Dez. 2017  ·  3Kommentare  ·  Quelle: microsoft/TypeScript

TypeScript-Version: Aktuelle Spielplatzversion (?)

Code

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

Verknüpfung

Erwartetes Verhalten:

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

Tatsächliches Verhalten:

Syntaxfehler, da typeof GenericGroup<RadioValues>; nicht unterstützt wird.

Motivation:

In meinem Anwendungsfall habe ich eine Klasse mit einem Generikum (wie GenericGroup ), das eine Klasse aus einer Drittanbieter-Bibliothek erweitert. Die Klasse aus der Drittanbieter-Bibliothek verwendet in ihrem Konstruktor mehrere Parameter. Wenn ich meine Klasse mit dem gefüllten Generikum aliase, möchte ich nicht jedes Mal die Parameter für die Drittanbieter-Bibliothek schreiben (wie bei new (name: string) => GenericGroup<CheckboxValues>; ), da ich sie nicht wirklich pflege.

(Es scheint mehrere verwandte Probleme zu geben, aber ich konnte kein Problem mit genau diesem Problem finden.)

Question

Hilfreichster Kommentar

Der Operator 'typeof' soll nicht den Konstruktor eines Typs beschreiben, sondern den Typ eines Wertes. SomeGenericist kein Wert, es ist ein Typ an und für sich. Andere Schnittstellen / Typen (wie der unten definierte) funktionieren ebenfalls nicht auf diese Weise.

interface MyInterface {
    name: string;
}

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

Eine Lösung hierfür besteht darin, einen generischen Typ zu definieren, um Konstruktoren wie Angular zu beschreiben:

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

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

von ( eckig / packages / core / src / type.ts )

Anwendungsbeispiel:

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

Alle 3 Kommentare

Der Operator 'typeof' soll nicht den Konstruktor eines Typs beschreiben, sondern den Typ eines Wertes. SomeGenericist kein Wert, es ist ein Typ an und für sich. Andere Schnittstellen / Typen (wie der unten definierte) funktionieren ebenfalls nicht auf diese Weise.

interface MyInterface {
    name: string;
}

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

Eine Lösung hierfür besteht darin, einen generischen Typ zu definieren, um Konstruktoren wie Angular zu beschreiben:

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

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

von ( eckig / packages / core / src / type.ts )

Anwendungsbeispiel:

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

Eine subtile Sache ist, dass generische Klassenkonstruktorfunktionen nicht in einem generischen Typ enthalten sind . Sie können dies erkennen, da der Typparameter für statische Elemente nicht gültig ist! Es "fühlt" sich an, als hätten Sie einen Typ wie diesen

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

aber der wirkliche Typ ist so

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

Danke euch beiden. Ich muss meinen Kopf darum wickeln. In meinem Fall gehe ich von einem Konstruktor eines Drittanbieters aus ( React.Component ), daher muss ich herausfinden, wie ich Ihr Feedback dort anwenden kann. Vielen Dank.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

Roam-Cooper picture Roam-Cooper  ·  3Kommentare

DanielRosenwasser picture DanielRosenwasser  ·  3Kommentare

manekinekko picture manekinekko  ·  3Kommentare

bgrieder picture bgrieder  ·  3Kommentare

siddjain picture siddjain  ·  3Kommentare