MiddleКодЧастоЕщё не отвечали
Типизируйте деструктурированный параметр и верните типизированный кортеж
connect принимает один объект опций, деструктурированный прямо в списке параметров, и возвращает хост, к которому подключился, вместе с числом допустимых попыток.
Требования:
- деструктурированный параметр должен быть типизирован (
hostобязателен,retries— нет); retriesпо умолчанию равен3и внутри тела должен быть обычнымnumber;- возвращаемая пара должна иметь тип
[string, number], а не(string | number)[].
export function connect({ host, retries }) {
// ваш код здесь
}Допишите реализацию.
Аннотация вешается на весь шаблон, а не на имена внутри него: ({ host, retries = 3 }: { host: string; retries?: number }). Значение по умолчанию сужает retries в теле до обычного number. Возврату нужна явная аннотация : [string, number]: вывод расширяет литерал до (string | number)[].
- ✗Писать
{ host: string }в шаблоне — это переименованиеhostвstring, а не типизация - ✗Ждать, что возвращаемый литерал массива выведется как кортеж
- ✗Думать, что default внутри шаблона всё равно оставляет имя с типом
T | undefined
- →Что вместо этого даст
as constна возвращаемом литерале массива? - →Почему элемент деструктурированного массива теряет позицию без аннотации кортежа?
Аннотация в деструктурированном параметре относится ко всему шаблону: она пишется после закрывающей скобки. Запись { host: string } внутри шаблона — это не типизация, а переименование host в переменную string.
export function connect(
{ host, retries = 3 }: { host: string; retries?: number },
): [string, number] {
// `retries` здесь — обычный number: default подставлен, undefined отсечён
return [host, retries];
}
const [h, n] = connect({ host: 'db.local' }); // h: string, n: numberДва места, где вывод не даст того, что нужно:
- Тип возврата. Без аннотации
[host, retries]выводится как(string | number)[]— массив, а не кортеж: позиции теряются, иnпришлось бы сужать. Аннотация: [string, number](илиas constна литерале, дающийreadonly [string, number]) сохраняет позиции. - Значение по умолчанию.
retries?: numberдаёт в телеnumber | undefined, но= 3прямо в шаблоне убираетundefined, поэтому проверка внутри не нужна.