webentwicklung-frage-antwort-db.com.de

Ruft Schlüssel einer TypeScript-Schnittstelle als String-Array ab

Ich habe viele Tabellen in Lovefield und den jeweiligen Schnittstellen für die Spalten, die sie haben. 
Beispiel:

export interface IMyTable {
  id: number;
  title: string;
  createdAt: Date;
  isDeleted: boolean;
}

Ich möchte die Eigenschaftsnamen dieser Schnittstelle in einem Array wie dem folgenden haben:

var IMyTable = ["id", "title", "createdAt", "isDeleted"];

Ich kann kein Objekt/Array basierend auf der Schnittstelle IMyTable direkt erstellen, die den Trick ausführen sollte, da ich die Schnittstellennamen der Tabellen dynamisch erhalten würde. Daher muss ich diese Eigenschaften in der Schnittstelle durchlaufen und ein Array daraus gewinnen.

Wie erreiche ich dieses Ergebnis.

36
Tushar Shukla

Ab TypeScript 2.3 (oder sollte ich 2.4 sagen, da in 2.3 diese Funktion a Bug enthält, die in [email protected] behoben wurde), können Sie einen benutzerdefinierten Transformator erstellen, um das zu erreichen, was Sie tun möchten.

Eigentlich habe ich bereits einen solchen benutzerdefinierten Transformator erstellt, der Folgendes ermöglicht.

https://github.com/kimamula/ts-transformer-keys

import { keys } from 'ts-transformer-keys';

interface Props {
  id: string;
  name: string;
  age: number;
}
const keysOfProps = keys<Props>();

console.log(keysOfProps); // ['id', 'name', 'age']

Leider sind benutzerdefinierte Transformatoren derzeit nicht so einfach zu verwenden. Sie müssen sie mit der TypeScript-Umwandlungs-API verwenden, anstatt den Befehl tsc auszuführen. Es gibt ein Problem , das eine Plugin-Unterstützung für benutzerdefinierte Transformatoren anfordert.

22
kimamula

Kippen. Schnittstellen sind zur Laufzeit nicht vorhanden. 

workaround

Erstellen Sie eine Variable des Typs und verwenden Sie Object.keys darauf.

10
basarat

Sie müssen eine Klasse erstellen, die Ihre Schnittstelle implementiert, instanziiert und dann mit Object.keys(yourObject) die Eigenschaften abrufen.

export class YourClass implements IMyTable {
    ...
}

dann

let yourObject:YourClass = new YourClass();
Object.keys(yourObject).forEach((...) => { ... });
5
Dan Def

Das Folgende erfordert, dass Sie die Schlüssel selbst auflisten, aber zumindest erzwingt TypScript, dass IUserProfile und IUserProfileKeys dieselben Schlüssel haben ( Required<T> wurde in TypeScript 2.8 hinzugefügt:

export interface IUserProfile  {
  id: string;
  name: string;
};
type KeysEnum<T> = { [P in keyof Required<T>]: true };
const IUserProfileKeys: KeysEnum<IUserProfile> = {
  id: true,
  name: true,
};
1
Maciek Wawro

Anstatt IMyTable als Interface zu definieren, versuchen Sie es als Klasse zu definieren. In TypeScript können Sie eine Klasse wie eine Schnittstelle verwenden.

Definieren/generieren Sie Ihre Klasse also für Ihr Beispiel folgendermaßen:

export class IMyTable {
    constructor(
        public id = '',
        public title = '',
        public createdAt: Date = null,
        public isDeleted = false
    )
}

Verwenden Sie es als Schnittstelle:

export class SomeTable implements IMyTable {
    ...
}

Schlüssel erhalten:

const keys = Object.keys(new IMyTable());
0
Derek