ما هي أنواع القوالب الحرفية
منذ Typescript 4.1 ، يمكنك تحسين كتابة السلاسل بشكل ملحوظ. فقط للتلخيص السريع ، في Typescript ، يمكنك تحديد ما يسمى بـ "الأنواع الحرفية". بدلاً من مجرد تعريف متغير كسلسلة ، يمكنك تضييق النوع إلى مجموعة محددة من السلاسل المسموح بها.
// Define a mutable string as 'Literal Type'.
let key: "name" | "department" = "name";
// This works, as 'department' is part of the type.
key = "department";
// Won't work, as it's not define in the union type.
key = "company";
// Of course, the same applies for functions.
function getKey(): "name" | "department" {
return Math.random() <= 0.5 ? "name" : "department";
}
بدءًا من Typescript 4.1 ، تم تطوير هذا المفهوم بشكل أكبر. من خلال أخذ "سلاسل القوالب الحرفية" من جافا سكريبت كمصدر إلهام ، يمكنك تطبيق نفس الصيغة على الأنواع الحرفية الخاصة بك في تنضيد. يتمثل الاختلاف الرئيسي في أنه مع "أنواع القوالب الحرفية" ، فإنك تكتسب قدرًا أكبر من المرونة ، حيث يمكن أن يأخذ النوع نفسه معلمات لهذا الشكل - المفهوم مشابه للأدوية ، ولكنه يختلف قليلاً من حيث أنه يتطلب قيمًا محددة.
// Define a Literal Type
type State = "ready";
// Nice, isn't it? As in Javascript's
// 'template literal strings', we can
// reuse the same syntax for TS.
//
// The create type here is now 'Key-ready'.
type Key = `key-${State}`;
// This of course works for union types as well.
// Let's take these non-descriptive types for a
// quick demo:
type GraphState = "sleep" | "ready" | "error";
type MachineState = "booting" | "running";
// And here's the 'template literal type':
type EntityState = `ES-${GraphState | MachineState}`;
// The possible combinations therefore
// work out like this:
//
// type EntityState = 'ES-sleep'
// | 'ES-ready'
// | 'ES-error'
// | 'ES-booting'
// | 'ES-running'
هناك المزيد مع Typescript 4.3
أثناء كتابتي لهذا ، تم إطلاق الإصدار المرشح لـ Typescript 4.3 ، والذي يتضمن مزيدًا من التحسينات على Template Literal Types.
أصبح نظام الكتابة الآن أكثر ديناميكية ويمكنه استنتاج الأنواع الصحيحة بشكل أفضل. هذه التغييرات الأخيرة أكثر نضجًا من نوع سلسلة القالب.
// This example is taken 1:1 from
// Typescript's 4.3 announcement.
// Please check out the link in the
// addendum to see all examples!
declare let s: string;
declare function f<T extends string>(x: T): T;
// Previously: string
// Now : `hello-${string}`
let x2 = f(`hello ${s}`);
استنتاج
كما رأيت ، تعد شركة Typescript لغة قوية عندما يتعلق الأمر بتعريف الأنواع الديناميكية. هذا صحيح بشكل خاص للأنواع المستندة إلى السلسلة. مع أحدث التغييرات في الإصدار 4.3 ، يمكن لنظام الكتابة أن يستنتج الأنواع الصحيحة بشكل أفضل من أي وقت مضى ، مما يجعل العمل مع Typescript مجرد متعة.