262 votes

Obtenir les clés d'une interface typographique sous forme de tableau de chaînes

J'ai beaucoup de tables dans Lovefield et leurs Interfaces pour les colonnes qu'ils ont.
Exemple:

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

J'aimerais avoir les noms des propriétés de cette interface dans un tableau comme ceci:

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

Je ne peut pas créer un objet ou un tableau basé sur l'interface IMyTable directement, ce qui devrait faire l'affaire parce que je voudrais faire de l'interface noms des tables de façon dynamique. Donc j'ai besoin d'itérer sur ces propriétés dans l'interface et d'obtenir un tableau hors de lui.

Comment puis-je parvenir à ce résultat.

89voto

kimamula Points 1982

Comme de Tapuscrit 2.3 (ou devrais-je dire 2.4, comme en 2.3 cette fonction contient un bug qui a été corrigé dans la typescript@2.4-dev), vous pouvez créer un transformateur pour obtenir ce que vous voulez faire.

En fait, j'ai déjà créé une coutume transformateur, ce qui permet les opérations suivantes.

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']

Malheureusement, la coutume transformateurs sont actuellement pas très facile à utiliser. Vous devez les utiliser avec le Tapuscrit de transformation de l'API au lieu d'exécution de la tsc de commande. Il y a un problème demandant une prise en charge de plugins pour personnaliser les transformateurs.

48voto

Maciek Wawro Points 212

Ce qui suit vous oblige à lister les clés vous-même, mais au moins TypeScript appliquera IUserProfile et IUserProfileKeys exactement aux mêmes clés ( Required<T> été ajouté dans TypeScript 2.8 ):

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

15voto

Derek Points 329

Au lieu de définir IMyTable comme interface, essayez de le définir en tant que classe. En dactylographie, vous pouvez utiliser une classe comme une interface.

Donc, pour votre exemple, définissez / générez votre classe comme ceci:

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

Utilisez-le comme une interface:

 export class SomeTable implements IMyTable {
    ...
}
 

Obtenir les clés:

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

5voto

Dan Def Points 912

Vous devrez créer une classe qui implémentera votre interface, l'instancier, puis utiliser Object.keys(yourObject) pour obtenir les propriétés.

 export class YourClass implements IMyTable {
    ...
}
 

puis

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

-3voto

basarat Points 22425

Ne peut pas. Les interfaces n'existent pas à l'exécution.

solution de contournement

Créez une variable du type et utilisez Object.keys dessus

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X