2017-05-11 3 views
17

Mam wiele tabel w Lovefield i ich odpowiednie interfejsy dla kolumn, które mają.
przykład:
Zdobądź klucze interfejsu Maszynowego jako tablicę ciągów znaków

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

Chciałbym mają nazwy właściwości tego interfejsu w tablicy, jak to:

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

nie można wprowadzić obiekt/układ oparty na interfejsie IMyTable bezpośrednio co powinno wystarczyć, ponieważ będę dynamicznie otrzymywać nazwy interfejsów tabel. Dlatego potrzebuję do iteracji tych właściwości w interfejsie i uzyskać z niego tablicy.

Jak osiągnąć ten wynik.

Odpowiedz

4

Nie można. Interfejsy nie istnieją w środowisku wykonawczym.

obejście

Tworzenie zmiennej typu i używać Object.keys na nim

+1

masz na myśli jak to: 'var abc: IMyTable = {}; Object.keys (abc) .forEach ((key) => {console.log (key)}); ' –

+3

Nie, ponieważ obiekt ten nie zawiera żadnych kluczy. Interfejs jest czymś, co używa TypeScript, ale odparowuje w JavaScript, więc nie ma już informacji informujących o "odbiciu" lub "introspekcji". Wszystkie JavaScript wie, że istnieje literalny obiekt pusty. Twoją jedyną nadzieją jest czekać (lub [zażądać] (https: // github.com/Microsoft/TypeScript/issues)) TypeScript zawiera sposób generowania tablicy lub obiektu ze wszystkimi kluczami w interfejsie do kodu źródłowego. Lub, jak mówi Dan Def, jeśli możesz użyć klasy, będziesz miał klucze zdefiniowane w postaci właściwości w każdym przypadku. – Jesper

+0

Otrzymasz również błąd TypeScript w tym wierszu: 'var abc: IMyTable = { } 'ponieważ literał pustego obiektu nie jest zgodny z kształtem tego interfejsu. – Jesper

2

Trzeba będzie dokonać klasy, która implementuje interfejs, oznacz ją, a następnie użyć Object.keys(yourObject) aby uzyskać właściwości.

export class YourClass extends IMyTable { 
    ... 
} 

następnie

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

Nie działa w moim przypadku, musiałbym wyświetlić te właściwości interfejsu, ale to nie jest to, co chcę? Nazwa interfejsu przychodzi dynamicznie, a następnie muszę określić jego właściwości. –

6

Jak maszynopisu 2.3 (lub powinienem powiedzieć 2.4, jak w 2.3 funkcja ta zawiera a bug który został ustalony w [email protected]), można utworzyć niestandardowy transformator, aby osiągnąć to, co chcesz zrobić.

Właściwie stworzyłem już taki niestandardowy transformator, który umożliwia następujące.

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

Niestety, transformatory niestandardowych obecnie nie są tak łatwe w obsłudze. Trzeba ich używać z interfejsem API transformacji TypeScript zamiast wykonywania komendy tsc. Istnieje an issue z prośbą o obsługę wtyczek dla niestandardowych transformatorów.

+0

Dzięki za odpowiedź, już widziałem i instalowałem ten niestandardowy transformator wczoraj, ale ponieważ używa on maszynopisu 2.4, nie ma to dla mnie żadnego zastosowania. –

+4

Witam, ta biblioteka również służy dokładnie mojemu wymaganiu, jednak otrzymuję komunikat "ts_transformer_keys_1.keys nie jest funkcją", gdy postępuję zgodnie z dokładnymi instrukcjami w dokumentacji. czy istnieje obejście tego? –

+0

Schludny! Czy uważasz, że można go rozszerzyć o parametr dynamiczny (uwaga 2 w readme)? – kenshin

1

Zamiast definiować IMyTable jak w interfejsie, spróbuj zdefiniować go jako klasę. W pismach maszynowych można użyć klasy podobnej do interfejsu.

Tak dla przykładu, zdefiniować/wygenerować klasę tak:

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

Użyj go jako interfejs:

export class SomeTable implements IMyTable { 
    ... 
} 

Uzyskaj klawiszy:

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