typescript - استفاده از مقادیر به جای نوعها در نوعهای شرطی


من میخواهم یک نوع زمان (00:00) داشته باشم که رشتهای باشد که فقط زمانهای معتبر را اجازه دهد. این نوع Time را مد نظر داشته باشید که همانطور که میخواهم عمل کند:

const hours = [
  '00' , '01', '02', '03', '04', '05', '06', '07', '08',
  '09' , '10', '11', '12', '13', '14', '15', '16', 
  '17' , '18', '19', '20', '21', '22', '23', '24'
] as const

type HH = typeof hours[number]

const minutes = [
  '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', 
  '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', 
  '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', 
  '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', 
  '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', 
  '50', '51', '52', '53', '54', '55', '56', '57', '58', '59'
] as const 

type MM = typeof minutes[number]

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

یک روش تمیزتر برای نوشتن این نوع میتواند باشد:

const digits = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ] as const
type Digit = typeof digits[number]
type HH1 = `${Digit}${Digit}` // can be 99, needs to be < 24!
type MM1 = `${Digit}${Digit}` // can be 99, needs to be < 60!
type Time1 = `${HH1}:${MM1}$` // can be 99:99, needs to be max 24:59

بنابراین من سعی میکنم از مقدار شاخص آرایه number از نوع typeof digits[number] یا مقدار خروجی string استفاده کنم تا ساعتها کمتر از ۲۴ و دقیقهها کمتر از ۶۰ باشند. آیا میتوانم به جای نوع یا مقدار string از مقدار number برای رسیدن به این هدف در یک نوع شرطی استفاده کنم؟

پاسخ شماره ۱

از نسخه TS 4.5 میتوانید کارهای زیر را انجام دهید:

type Enumerate<N extends number, Acc extends number[] = []> = Acc['length'] extends N
  ? Acc[number]
  : Enumerate<N, [...Acc, Acc['length']]>

type NumberRange<F extends number, T extends number> = Exclude<Enumerate<T>, Enumerate<F>>

type Time = NumberRange<0, 59> // 0...59

این تا زمانی است که ما بازهها را به عنوان نوع عددی در TS داشته باشیم.