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 داشته باشیم.
