TypeScript уже выводит точные ключи из литералов объектов. Для повторного использования можно взять typeof объекта; для явной проверки — задать интерфейс с конкретными методами.
Точная типизация методов объектов по их именам
TypeScript уже выводит точные ключи из литералов объектов. Для повторного использования можно взять typeof объекта; для явной проверки — задать интерфейс с конкретными методами.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо обеспечить строгую типизацию двух объектов, чтобы каждый метод сохранял свой тип. Применение обобщённых типов вроде string или Record<string, …> приводит к утрате информации о конкретных ключах.
Требования:
- Для объекта
vtempObjзадать точные свойстваgetVtemplatesиpostVtemplates. - Для объекта
rptObjзадать точные свойстваgetReportsиputReports. - При объявлении типы каждого свойства должны быть явно известны компилятору.
// примерные объекты:
const vtempObj = {
getVtemplates: () => {/* ... */},
postVtemplates: () => {/* ... */}
}
const rptObj = {
getReports: () => {/* ... */},
putReports: () => {/* ... */}
}
// типизация должна сохранять ключи и их значения
Ответ
TypeScript уже выводит точные ключи из литералов объектов. Для повторного использования можно взять typeof объекта; для явной проверки — задать интерфейс с конкретными методами.
type VtemplatesApi = {
getVtemplates: () => void;
postVtemplates: () => void;
};
type ReportsApi = {
getReports: () => void;
putReports: () => void;
};
const vtempObj: VtemplatesApi = { getVtemplates() {}, postVtemplates() {} };
const rptObj: ReportsApi = { getReports() {}, putReports() {} };
Здесь void соответствует пустым функциям из условия. В реальном API замените сигнатуры конкретными параметрами и возвращаемыми типами. Record<string, ...> расширяет допустимые имена ключей, тогда как интерфейс перечисляет только нужные. Альтернатива — satisfies для проверки контракта с сохранением выведенного типа выражения.