Типизируйте деструктурированный параметр и верните типизированный кортеж
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
Два места, где вывод не даст того, что нужно:
массив, а не кортеж: позиции теряются, и n пришлось бы сужать. Аннотация : [string, number] (или as const на литерале, дающий readonly [string, number]) сохраняет позиции.
прямо в шаблоне убирает undefined, поэтому проверка внутри не нужна.
- Тип возврата. Без аннотации
[host, retries]выводится как(string | number)[]— - Значение по умолчанию.
retries?: numberдаёт в телеnumber | undefined, но= 3