2017-05-11 28 views
17

की सरणी के रूप में एक प्रकारस्क्रिप्ट इंटरफ़ेस की कुंजी प्राप्त करें मेरे पास उनके पास कौन से कॉलम हैं, इसके लिए लवफील्ड और उनके संबंधित इंटरफेस में बहुत सी टेबल हैं।
उदाहरण:

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

मैं इंटरफ़ेस IMyTable सीधे के आधार पर एक वस्तु/सरणी नहीं बना सकते:
स्ट्रिंग्स

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

मैं इस तरह एक सरणी में इस इंटरफ़ेस में प्रॉपर्टी के नाम करना चाहते हैं जो चाल चलाना चाहिए क्योंकि मुझे गतिशील रूप से टेबल के इंटरफ़ेस नाम मिलेंगे। इसलिए मुझे इंटरफ़ेस में इन गुणों पर पुन: प्रयास करने की आवश्यकता है और इसमें से एक सरणी प्राप्त करें।

मैं इस परिणाम को कैसे प्राप्त करूं।

उत्तर

4

नहीं कर सकता। रनटाइम पर इंटरफेस मौजूद नहीं है।

वैकल्पिक हल

प्रकार का एक चर बनाएँ और उस पर Object.keys का उपयोग

+1

आप की तरह मतलब है

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

एक अंतरफलक के रूप में यह प्रयोग करें यह: 'var abc: IMyTable = {}; Object.keys (abc) .forEach ((key) => {console.log (key)}); ' –

+3

नहीं, क्योंकि उस ऑब्जेक्ट पर इसकी कोई कुंजी नहीं है। एक इंटरफ़ेस ऐसा कुछ है जो टाइपस्क्रिप्ट का उपयोग करता है लेकिन जावास्क्रिप्ट में वाष्पित होता है, इसलिए किसी भी "प्रतिबिंब" या "चौराहे" को सूचित करने के लिए कोई जानकारी नहीं छोड़ी जाती है। सभी जावास्क्रिप्ट जानता है कि एक खाली वस्तु अक्षरशः है। आपकी एकमात्र आशा है कि प्रतीक्षा करें (या [अनुरोध करें] (https: // github।कॉम/माइक्रोसॉफ्ट/टाइपस्क्रिप्ट/मुद्दे)) टाइपस्क्रिप्ट में स्रोत कोड में इंटरफ़ेस में सभी कुंजियों के साथ सरणी या ऑब्जेक्ट उत्पन्न करने का एक तरीका शामिल है। या, जैसा कि डेन डेफ कहता है, यदि आप कक्षा का उपयोग कर सकते हैं, तो आपके पास प्रत्येक उदाहरण में गुणों के रूप में परिभाषित कुंजी होगी .. – Jesper

+0

आपको इस लाइन पर टाइपस्क्रिप्ट द्वारा भी एक त्रुटि मिलेगी: 'var abc: IMyTable = { } 'क्योंकि रिक्त ऑब्जेक्ट शाब्दिक उस इंटरफ़ेस के आकार के अनुरूप नहीं है। – Jesper

2

आप एक वर्ग है कि अपने इंटरफेस को लागू करता है यह दृष्टांत और फिर Object.keys(yourObject) का उपयोग गुण प्राप्त करने की आवश्यकता होगी।

export class YourClass extends IMyTable { 
    ... 
} 

तो

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

मेरे मामले में काम नहीं करता है, मुझे इंटरफ़ेस के उन गुणों को सूचीबद्ध करना होगा, लेकिन यह वही नहीं है जो मैं चाहता हूं? इंटरफ़ेस का नाम गतिशील रूप से आता है और फिर मुझे अपनी गुणों को निर्धारित करना होगा –

6

टाइपप्रति 2.3 के रूप में (या मैं 2.4 कहना चाहिए, के रूप में 2.3 में इस सुविधा a bug जो [email protected] में तय किया गया है शामिल हैं), आप एक कस्टम बना सकते हैं ट्रांसफॉर्मर जो आप करना चाहते हैं उसे प्राप्त करने के लिए।

असल में, मैंने पहले से ही एक कस्टम ट्रांसफार्मर बनाया है, जो निम्नलिखित को सक्षम बनाता है।

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

दुर्भाग्य से, कस्टम ट्रांसफार्मर वर्तमान में नहीं उपयोग करने के लिए इतना आसान नहीं है। आपको tsc कमांड निष्पादित करने के बजाय टाइपस्क्रिप्ट ट्रांसफ़ॉर्मेशन API के साथ उनका उपयोग करना होगा। कस्टम ट्रांसफार्मर के लिए प्लगइन समर्थन का अनुरोध करने के लिए an issue है।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद, मैंने कल ही इस कस्टम ट्रांसफॉर्मर को देखा और इंस्टॉल किया है, लेकिन चूंकि यह टाइपस्क्रिप्ट 2.4 का उपयोग करता है, यह अब तक मेरे लिए उपयोग नहीं करता है। –

+4

हाय, यह लाइब्रेरी बिल्कुल मेरी आवश्यकता भी प्रदान करती है, हालांकि, मुझे दस्तावेज में सटीक चरणों का पालन करने पर 'ts_transformer_keys_1.keys एक फ़ंक्शन नहीं है। क्या यह एक कामकाज है? –

+0

साफ! क्या आपको लगता है कि इसे गतिशील प्रकार पैरामीटर (रीडमे में नोट 2) लेने के लिए बढ़ाया जा सकता है? – kenshin

1

इंटरफ़ेस में IMyTable को परिभाषित करने के बजाय, इसे कक्षा के रूप में परिभाषित करने का प्रयास करें। टाइपस्क्रिप्ट में आप एक इंटरफेस की तरह एक वर्ग का उपयोग कर सकते हैं।

अपने उदाहरण के लिए

तो, यह की तरह अपने वर्ग/उत्पन्न परिभाषित:

export class SomeTable implements IMyTable { 
    ... 
} 

कुंजी प्राप्त करें::

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