इंटरफ़ेस से कुंजियाँ सरणी बनाने का कोई आसान तरीका नहीं है। प्रकार रन-टाइम पर मिटा दिए जाते हैं और ऑब्जेक्ट प्रकार (अनियंत्रित, नाम) को कुछ प्रकार की हैक के बिना टुपल प्रकार (ऑर्डर किए गए, अनाम) में परिवर्तित नहीं किया जा सकता है।
विकल्प 1: मैनुअल दृष्टिकोण
// Record type ensures, we have no double or missing keys, values can be neglected
function createKeys(keyRecord: Record<keyof IMyTable, any>): (keyof IMyTable)[] {
return Object.keys(keyRecord) as any
}
const keys = createKeys({ isDeleted: 1, createdAt: 1, title: 1, id: 1 })
// const keys: ("id" | "title" | "createdAt" | "isDeleted")[]
(+) सरल (-) ऐरर रिटर्न टाइप, नो टपल (+ -) मैन्युअल लेखन ऑटो-कम्प्लीट करने के साथ
विस्तार: हम कल्पना करने की कोशिश कर सकते हैं और टपल उत्पन्न करने के लिए पुनरावर्ती प्रकारों का उपयोग कर सकते हैं। यह केवल मेरे लिए प्रॉप्स के एक जोड़े (~ 5,6) के लिए काम करता था जब तक कि प्रदर्शन में बड़े पैमाने पर गिरावट नहीं हुई। डीप नेस्टेड रिकर्सिव टाइप भी आधिकारिक तौर पर टीएस द्वारा समर्थित नहीं हैं - मैं इस उदाहरण को पूर्णता के लिए यहां सूचीबद्ध करता हूं ।
विकल्प 2: टीएस कंपाइलर एपीआई ( ts-morph ) पर आधारित कोड जनरेटर
// ./src/mybuildstep.ts
import {Project, VariableDeclarationKind, InterfaceDeclaration } from "ts-morph";
const project = new Project();
// source file with IMyTable interface
const sourceFile = project.addSourceFileAtPath("./src/IMyTable.ts");
// target file to write the keys string array to
const destFile = project.createSourceFile("./src/generated/IMyTable-keys.ts", "", {
overwrite: true // overwrite if exists
});
function createKeys(node: InterfaceDeclaration) {
const allKeys = node.getProperties().map(p => p.getName());
destFile.addVariableStatement({
declarationKind: VariableDeclarationKind.Const,
declarations: [{
name: "keys",
initializer: writer =>
writer.write(`${JSON.stringify(allKeys)} as const`)
}]
});
}
createKeys(sourceFile.getInterface("IMyTable")!);
destFile.saveSync(); // flush all changes and write to disk
इस फ़ाइल को हम संकलित करने और चलाने के बाद tsc && node dist/mybuildstep.js, ./src/generated/IMyTable-keys.tsनिम्न सामग्री वाली एक फ़ाइल उत्पन्न होती है:
// ./src/generated/IMyTable-keys.ts
const keys = ["id","title","createdAt","isDeleted"] as const;
(+) स्वचालित समाधान (+) सटीक टपल प्रकार (-) के लिए बिल्ड-स्टेप की आवश्यकता होती है
पुनश्च: मैंने चुना है ts-morph, क्योंकि यह मूल टीएस कंपाइलर एपीआई का एक सरल विकल्प है।