أنواع سلاسل قوالب الكتابة

كيفية تضييق نطاق أنواع السلسلة باستخدام آلية سلسلة القالب

ما هي أنواع القوالب الحرفية

منذ 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 مجرد متعة.

الاقتراحات

ذات صلة

ملحق

اللغات