নিরাপদ রূপগুলি
সুরক্ষা সংকলন-সময় চেক সহ একটি ইন্টারফেস থেকে কীগুলির একটি অ্যারে বা টুপল কী তৈরি করতে কিছুটা সৃজনশীলতার প্রয়োজন। প্রকারগুলি রান-টাইমে মুছে ফেলা হয় এবং অবজেক্টের ধরণগুলি (আনর্ডারড, নামযুক্ত) অসমর্থিত কৌশলগুলি অবলম্বন না করে টিপল ধরণের (অর্ডারযুক্ত, নামবিহীন) রূপান্তর করা যায় না ।
অন্যান্য উত্তরের সাথে তুলনা
এখানে প্রস্তাবিত রূপগুলি সমস্ত রেফারেন্স অবজেক্ট টাইপের মতো ডুপ্লিকেট বা হারিয়ে যাওয়া টিপল আইটেমগুলির ক্ষেত্রে একটি সংকলন ত্রুটি বিবেচনা / ট্রিগার করে IMyTable। উদাহরণস্বরূপ একটি অ্যারের ধরণের ঘোষণা (keyof IMyTable)[]এই ত্রুটিগুলি ধরতে পারে না।
তদতিরিক্ত, তাদের জন্য কোনও নির্দিষ্ট গ্রন্থাগারের (শেষ প্রকারের ব্যবহারগুলি ts-morph, যা আমি জেনেরিক সংকলক মোড়ক হিসাবে বিবেচনা করব) প্রয়োজন নেই, কোনও বস্তুর বিপরীতে একটি টুপল প্রকার নির্গত করুন (কেবলমাত্র প্রথম সমাধানটি অ্যারে তৈরি করে) বা প্রশস্ত অ্যারের ধরণের (সাথে তুলনা করুন) এই উত্তরগুলি ) এবং শেষ পর্যন্ত ক্লাসের দরকার নেই ।
বৈকল্পিক 1: সাধারণ টাইপ করা অ্যারে
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 })
+স্বতঃসমাপ্তি অ্যারে +-সহ সহজ ম্যানুয়াল -, কোনও টুপল নেই
খেলার মাঠ
আপনি যদি কোনও রেকর্ড তৈরি করতে পছন্দ করেন না তবে এই বিকল্পটি Setএবং দৃser়তার সাথে জেনে নিন ।
বৈকল্পিক 2: সহায়ক ফাংশন দিয়ে টিপল
function createKeys<T extends readonly (keyof IMyTable)[] | [keyof IMyTable]>(
t: T & CheckMissing<T, IMyTable> & CheckDuplicate<T>): T {
return t
}
++-স্বয়ংক্রিয় সমাপ্তি +-আরও উন্নত, জটিল ধরণের সঙ্গে ম্যানুয়াল tuple
খেলার মাঠ
ব্যাখ্যা
createKeysকম্পাইল-টাইম চেকগুলি অতিরিক্ত দৃser়তার সাথে ফাংশন পরামিতি প্রকারটি মার্জ করে উপযুক্ত ইনপুট না দেওয়ার জন্য ত্রুটি নির্গত করে। কলি দিক থেকে অ্যারের পরিবর্তে টিপলের অনুপাত জোর করার (keyof IMyTable)[] | [keyof IMyTable]একটি "কালো যাদু" উপায় । বিকল্পভাবে, আপনি কলার পক্ষ থেকে / দৃ const় অবস্থানগুলিas const ব্যবহার করতে পারেন ।
CheckMissingচেকগুলি, যদি Tথেকে কীগুলি মিস করে U:
type CheckMissing<T extends readonly any[], U extends Record<string, any>> = {
[K in keyof U]: K extends T[number] ? never : K
}[keyof U] extends never ? T : T & "Error: missing keys"
type T1 = CheckMissing<["p1"], {p1:any, p2:any}>
type T2 = CheckMissing<["p1", "p2"], { p1: any, p2: any }>
দ্রষ্টব্য: T & "Error: missing keys"কেবলমাত্র ভাল আইডিই ত্রুটির জন্য। আপনিও লিখতে পারতেন never। CheckDuplicatesডাবল টুপল আইটেমগুলি পরীক্ষা করে:
type CheckDuplicate<T extends readonly any[]> = {
[P1 in keyof T]: "_flag_" extends
{ [P2 in keyof T]: P2 extends P1 ? never :
T[P2] extends T[P1] ? "_flag_" : never }[keyof T] ?
[T[P1], "Error: duplicate"] : T[P1]
}
type T3 = CheckDuplicate<[1, 2, 3]>
type T4 = CheckDuplicate<[1, 2, 1]>
দ্রষ্টব্য: টিপলগুলিতে অনন্য আইটেমের চেকগুলিতে আরও ইনফোগুলি এই পোস্টে রয়েছে । সঙ্গে হিজড়া 4.1 , আমরা ত্রুটি স্ট্রিং অনুপস্থিত কী নাম করতে পারেন - কটাক্ষপাত করা এই খেলার মাঠ ।
বৈকল্পিক 3: রিকার্সিভ টাইপ
সংস্করণ ৪.১ সহ, টাইপসক্রিপটি আনুষ্ঠানিকভাবে শর্তসাপেক্ষ পুনরাবৃত্ত প্রকারগুলিকে সমর্থন করে , যা এখানেও সম্ভবত ব্যবহার করা যেতে পারে। যদিও, সংযুক্তি জটিলতার কারণে টাইপ গণনা ব্যয়বহুল - কর্মক্ষমতা 5-6 এর বেশি আইটেমের জন্য ব্যাপকভাবে হ্রাস পায় rad আমি সম্পূর্ণতার জন্য এই বিকল্পের তালিকা ( খেলার মাঠ ):
type Prepend<T, U extends any[]> = [T, ...U]
type Keys<T extends Record<string, any>> = Keys_<T, []>
type Keys_<T extends Record<string, any>, U extends PropertyKey[]> =
{
[P in keyof T]: {} extends Omit<T, P> ? [P] : Prepend<P, Keys_<Omit<T, P>, U>>
}[keyof T]
const t1: Keys<IMyTable> = ["createdAt", "isDeleted", "id", "title"]
++-স্বয়ংক্রিয় সমাপ্তির সাথে +কোনও সহায়িকার ফাংশন --কর্মক্ষমতা নিয়ে ম্যানুয়াল টিপল করুন
বৈকল্পিক 4: কোড জেনারেটর / টিএস সংকলক এপিআই
ts-morph এখানে বেছে নেওয়া হয়েছে, কারণ এটি মূল TS সংকলক API এর একটি সহজ সরল মোড়কের বিকল্প । অবশ্যই, আপনি সরাসরি সংকলক এপিআইও ব্যবহার করতে পারেন। জেনারেটর কোডটি দেখুন:
import {Project, VariableDeclarationKind, InterfaceDeclaration } from "ts-morph";
const project = new Project();
const sourceFile = project.addSourceFileAtPath("./src/IMyTable.ts");
const destFile = project.createSourceFile("./src/generated/IMyTable-keys.ts", "", {
overwrite: true
});
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();
আমরা এই ফাইলটি সংকলন ও চালনার পরে নিম্নলিখিত বিষয়বস্তু সহ tsc && node dist/mybuildstep.jsএকটি ফাইল ./src/generated/IMyTable-keys.tsউত্পন্ন হয়:
const keys = ["id","title","createdAt","isDeleted"] as const;
++একাধিক বৈশিষ্ট্যের জন্য স্বয়ংক্রিয়-উত্পন্ন উত্পাদনের সমাধানকে মাপার যোগ্য নয় +কোনও সহায়ক ফাংশন +দ্বিগুণ -অতিরিক্ত বিল্ড-স্টেপ -সংকলক API এর সাথে পরিচিতির প্রয়োজন