squadbrodyaga
@squadbrodyaga
帆は風を変えた

Как сделать динамическую проверку существования ключа при создании функции?

Здравствуйте, можно ли при создании функции сделать проверку на то, есть ли в объекте ключ, который указан в качестве значения другого ключа? Вот что я имею ввиду:

function helloFunc(arg: {
  nameKey: string,
  object: {
    // а вот тут нужно проверить, что в объекте существует ключ,
    // название которого указано в "nameKey"
  }
}) {
  console.log(`Привет,  ${arg.object[nameKey]}`)
}


Я хочу сделать это, чтобы при создании функции редактор давал вот такие подсказки:
// например, существует вот такой объект:
const user = {
  id: 1
  firstName: 'Иван',
}

helloFunc({ nameKey: 'lastName', object: user }) 
// вот тут редактор должен подсказывать, что ключа "lastname" не существует в объекте user


helloFunc({ nameKey: 'firstName', object: user }) 
// всё хорошо, ключ существует, код работает


Думаю вы поняли, что я хочу сделать, но возможно ли?
  • Вопрос задан
  • 178 просмотров
Решения вопроса 1
WblCHA
@WblCHA
Taulan Khatuaev, pavelpressf, потрясающие ответы с эни (нет).

function helloFunc<T extends object, K extends keyof T>(arg: {
  nameKey: K,
  object: T
}) {
  console.log(`Привет,  ${arg.object[arg.nameKey]}`)
}


https://www.typescriptlang.org/play?#code/GYVwdgxg...
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
i229194964
@i229194964
Веб разработчик
Вам нужно будет определить интерфейс для объекта который передается в функцию
interface HelloFuncArg {
  nameKey: string;
  object: {
    [key: string]: any; // определение объекта с неизвестными ключами
  };
}

function helloFunc(arg: HelloFuncArg) {
  if (!(arg.nameKey in arg.object)) {
    console.log(`Ключ ${arg.nameKey} отсутствует в объекте.`);
    return;
  }

  console.log(`Привет, ${arg.object[arg.nameKey]}`);
}
Ответ написан
@pavelpressf
function helloFunc(arg: {
  nameKey: string,
  object: {
    [key: string]: any // указываем, что в объекте могут быть ключи любых типов
  }
}) {
  if (!(arg.object.hasOwnProperty(arg.nameKey))) {
    console.error(`Ключ "${arg.nameKey}" не найден в объекте.`); // лучше использовать console.error вместо console.log
    return;
  }
  console.log(`Привет,  ${arg.object[arg.nameKey]}`)
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы