Tengo muchas tablas en Lovefield y sus respectivas interfaces para las columnas que tienen.
Ejemplo:
export interface IMyTable { id: number; title: string; createdAt: Date; isDeleted: boolean; }Me gustaría tener los nombres de propiedad de esta interfaz en una matriz como esta:
const IMyTable = ["id", "title", "createdAt", "isDeleted"]; No puedo hacer un objeto/matriz basado en la interfaz IMyTable directamente, lo que debería funcionar porque obtendría los nombres de interfaz de las tablas de forma dinámica. Por lo tanto, necesito iterar sobre estas propiedades en la interfaz y obtener una matriz.
¿Cómo logro este resultado?
A partir de TypeScript 2.3 (o debería decir 2.4 , ya que en 2.3 esta función contiene un error que se solucionó en typescript@2.4-dev ), puede crear un transformador personalizado para lograr lo que desea hacer.
En realidad, ya he creado un transformador personalizado de este tipo, que permite lo siguiente.
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']Desafortunadamente, los transformadores personalizados actualmente no son tan fáciles de usar. Debe usarlos con la API de transformación de TypeScript en lugar de ejecutar el comando tsc. Hay un problema al solicitar un soporte de complemento para transformadores personalizados.
Tal vez sea demasiado tarde, pero en la versión 2.1 de TypeScript puede usar keyof para obtener el tipo como este:
interface Person { name: string; age: number; location: string; } type K1 = keyof Person; // "name" | "age" | "location" type K2 = keyof Person[]; // "length" | "push" | "pop" | "concat" | ... type K3 = keyof { [x: string]: Person }; // stringLo siguiente requiere que enumere las claves por su cuenta, pero al menos TypeScript exigirá que IUserProfile y IUserProfileKeys tengan exactamente las mismas claves ( Required<T> se agregó en 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, };