كيفية تعريف نوع سلسلة متطابقة مع تعبير نظامي في تايبسكريبت؟


هل من الممكن تعريف واجهة تحتوي على بعض المعلومات حول صيغة النص؟ خذ المثال التالي:

interface timeMarkers{
    markerTime: string[]        
};

مثال سيكون:

{
   markerTime: ["0:00","1:30", "1:48"]                   
}

سؤالي: هل هناك طريقة لتحديد نوع markerTime بحيث يجب أن تتطابق قيمة السلسلة دائمًا مع هذا التعبير النمطي، بدلاً من إعلانها ببساطة كـ string[] والانطلاق من هناك؟

var reg = /[0-9]?[0-9]:[0-9][0-9]/;

الإجابة رقم 1

لا توجد طريقة لتعريف مثل هذا النوع. هناك اقتراح على GitHub لدعمه، لكنه حاليًا لا يبدو أولوية. صوّت عليه وربما يقوم الفريق بتضمينه في إصدار مستقبلي.

تعديل

بدءًا من الإصدار 4.1 يمكنك تعريف نوع قالب نصي يتحقق من صحة السلسلة دون الحاجة فعليًا إلى تعريف كل الخيارات:

type MarkerTime =`${number| ''}${number}:${number}${number}`

let a: MarkerTime = "0-00" // error
let b: MarkerTime = "0:00" // ok
let c: MarkerTime = "09:00" // ok

رابط الملعب

الإجابة رقم 2

حتى تصبح أنواع التعبيرات النمطية متاحة للغة، يمكنك الآن استخدام أنواع النصوص القالبية في TS 4.1.

دعني أشير إلى مثال السؤال وأوضح كيفية نمذجة نوع string مقيد بالوقت يسمى Time. يتوقع Time سلاسل بالنمط hh:mm (مثل "23:59") هنا من أجل التبسيط.

الخطوة 1: تحديد أنواع HH و MM

Array.from({length:24},(v,i)=> i).reduce((acc,cur)=> `${acc}${cur === 0 ? "" : "|"}'${String(cur).padStart(2, 0)}'`, "type HH = ")
Array.from({length:60},(v,i)=> i).reduce((acc,cur)=> `${acc}${cur === 0 ? "" : "|"}'${String(cur).padStart(2, 0)}'`, "type MM = ")
type HH = '00'|'01'|'02'|'03'|'04'|'05'|'06'|'07'|...|'22'|'23'
type MM = '00'|'01'|'02'|'03'|'04'|'05'|'06'|'07'|...|'58'|'59'

الخطوة 2: إعلان Time

type Time = `${HH}:${MM}`

بسيط هكذا.

الخطوة 3: بعض الاختبارات

const validTimes: Time[] = ["00:00","01:30", "23:59", "16:30"]
const invalidTimes: Time[] = ["30:00", "23:60", "0:61"] // all emit error

إليك مثال على كود مباشر للتجربة مع Time.

الإجابة رقم 3

type D1 = 0|1;
type D3 = D1|2|3;
type D5 = D3|4|5;
type D9 = D5|6|7|8|9;

type Hours = `${D9}` | `${D1}${D9}` | `2${D3}`;
type Minutes = `${D5}${D9}`;
type Time = `${Hours}:${Minutes}`;

حل مضغوط يجمع بين أفكار @bela53 و @yoel halb.

هذا الحل يحتوي على 2039 عضو تعداد لنوع الوقت.

ملعب Ts

الإجابة رقم 4

اعتمادًا على إجابة @bela53 ولكن بشكل أبسط بكثير، يمكننا عمل حل بسيط جدًا يشبه ما فعله @Titian ولكن بدون العيوب:

type HourPrefix = '0'|'1'|'2';
type MinutePrefix = HourPrefix | '3'|'4'|'5';
type Digit = MinutePrefix |'6'|'7'|'8'|'9';

type Time = `${HourPrefix | ''}${Digit}:${MinutePrefix}${Digit}`

const validTimes: Time[] = ["00:00","01:30", "23:59", "16:30"]
const invalidTimes: Time[] = ["30:00", "23:60", "0:61"] // all emit error