So verwenden Sie eine statische Funktion einer als Parameter übergebenen Klasse

Sechs

Grundsätzlich muss ich eine statische Funktion einer als Parameter übergebenen Klasse verwenden:

BEARBEITEN:

Ich habe mich nicht richtig erklärt, ich hoffe ihr könnt mich mit diesem Beispiel verstehen.

Minimal reproduzierbares Beispiel.

const TABLES = {
  bike: [],
  car: []
};

class Vehicles {
  static table = "";
  static getAll<T extends Vehicles>(): T[] {
    return TABLES[this.table];
  }
}

class Bike extends Vehicles {
  static table = "bike";
}

class Car extends Vehicles {
  static table = "car";
}

function getVehicleByClass<T extends Vehicles>(Vehicle: typeof T) { // 'T' only refers to a type, but is being used as a value here.
  Vehicle.getAll();
}

getVehicleByClass<Car>(Car);
TJ Crowder

Aktualisierte Antwort

...nach der Bearbeitung der Frage.

Der generische Typ sollte typeof Vehicleseher erweitern als Vehicles:

function getVehicleByClass<T extends typeof Vehicles>(Vehicle: T) {
  Vehicle.getAll();
}

Auf dem Spielplatz

Das heißt, ich könnte mir einen Typ geben für typeof Vehicles:

type VehiclesType = typeof Vehicles;

Dann:

function getVehicleByClass<T extends VehiclesType>(Vehicle: T) {
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^
  Vehicle.getAll();
}

Auf dem Spielplatz

...nur weil ich in kleineren Stücken besser denke. :-D

Ursprüngliche Antwort

(Ich lasse das nur, weil du sagtest, es sei nützlich für einige andere Dinge, an denen du arbeitest...)

Was Sie haben, sollte funktionieren, ich vermute, das eigentliche Problem besteht darin, dass Sie keine Eingaben für Object.values(hinzugefügt in ES2017) haben. Sie sollten Ihre tsconfig.json überprüfen, um sicherzustellen, dass Ihre libOption ES2017 oder höher ist.

Wenn Sie die Eingaben für haben Object.values, funktioniert dies :

class Model {
    static associate(models: { [key: string]: typeof Model }): { [key: string]: typeof Model } {
        return { foo: Model };
    }
}
class Model2 extends Model {
}
class Model3 extends Model {
}

async function createAssociations(models: { [key: string]: typeof Model }): Promise<void> {
  Object.values(models).forEach(model => {
    if (model.associate) {
      model.associate(models);
    }
  });
}

... obwohl ich denke, dass ich einen Typ für diesen {[key: string]: typeof Model}Typ verwenden würde, da Sie ihn an mehreren Stellen verwenden:

type ModelValuesObject = { [key: string]: typeof Model };

Dann:

class Model {
    static associate(models: ModelValuesObject): ModelValuesObject {
        return { foo: Model };
    }
}
class Model2 extends Model {
}
class Model3 extends Model {
}

async function createAssociations(models: ModelValuesObject): Promise<void> {
  Object.values(models).forEach(model => {
    if (model.associate) {
      model.associate(models);
    }
  });
}

Wenn Sie die minimale Änderung wünschen , können Sie den modelParameter Ihres forEachRückrufs eingeben:

Object.values(models).forEach((model: typeof Model) =>

Dadurch können Sie die staticMethode für die Klassen in modelden Werten von verwenden.

Aber TypeScript kann es ableiten. Hier habe ich es genommen {[key: string]: typeof Model}und ihm einen praktischen Namen gegeben, damit wir es wiederverwenden können:

type ModelValuesObject = { [key: string]: typeof Model };

Dann ist es:

class Model {
    static associate(models: ModelValuesObject): ModelValuesObject {
        return { foo: Model };
    }
}
class Model2 extends Model {
}
class Model3 extends Model {
}

async function createAssociations(models: ModelValuesObject): Promise<void> {
  Object.values(models).forEach(model => {
    if (model.associate) {
      model.associate(models);
    }
  });
}

Auf dem Spielplatz

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

So verketten Sie den als Parameter in einer Funktion übergebenen Index

Verwenden einer als Parameter übergebenen Funktion

JS: Verwenden eines an eine Funktion direkt übergebenen Arguments als Parameter einer verschachtelten Funktion

Javascript - Wie überschreibe ich eine Variable nicht, wenn sie in einer als Parameter übergebenen Funktion verwendet wird?

So rufen Sie eine nicht statische Methode von einer statischen Funktion in einer Klasse in PHP auf

So schreiben Sie eine Funktion mit einer Liste als Parameter

Schwache Referenzierung einer als Parameter übergebenen Funktion

Typescript: Argumente einer als Parameter übergebenen Callback-Funktion an eine andere Funktion ableiten

Django: So verwenden Sie Daten aus einer Funktion als Feld in der Meta-Klasse

So ändern Sie $(this) als Parameter einer Funktion

So verwenden Sie eine Funktion als Eigenschaft eines Objekts in einer anderen Funktion in Javascript

So verwenden Sie eine Liste von einer Funktion in eine andere Funktion. (In einer Klasse) | Python 3 (+ pqt5)

Verwenden einer Funktion als Parameter für eine andere Funktion

Übergeben Sie die Eigenschaft einer Klasse als Parameter an eine Funktion, die die Eigenschaft auswerten kann

Übergeben Sie eine übergeordnete Klasse als Parameter an eine Funktion

So erhalten Sie eine mathematische Funktion als Benutzereingabe in Python und verwenden sie in einer Schleife

So führen Sie eine Funktion aus, deren Details in einer anderen Funktion als Parameter übergeben werden

So weisen Sie dem Parameter einer anderen Funktion eine Powershell-Funktion als Argument zu

So verwenden Sie die Funktion __str__, um eine Zeichenfolgendarstellung einer Klasse zurückzugeben

So verwenden Sie eine externe Variable in einer Klasse/Funktion/einem Objekt in PHP

So verwenden Sie eine Klasse anstelle einer ID für die jquery-Funktion

So verwenden Sie den Wert von RETURNING id als Parameter in einer anderen Funktion - Postgresql

So konvertieren Sie eine Zeichenfolge in einen vorhandenen Variablennamen einer Liste als Parameter einer Funktion

So verwenden Sie eine Schleife in einer Funktion, die zwei Parameter akzeptiert, ein Array und eine Zahl

So verwenden Sie die statische Klasse in Express

So verwenden Sie eine benutzerdefinierte Funktion als Spaltenstandard in einer PostgreSQL-Tabelle

So verwenden Sie eine Textzeichenfolge als Variable in einer benutzerdefinierten R-Funktion

So verwenden Sie einen unique_ptr als Argument für eine Funktion, die eine Basisklasse als Parameter benötigt

Zulassen, dass ein Python-Dekorator eine Klasse als Parameter verwendet, wenn sie innerhalb der übergebenen Klasse verwendet wird