Typescript: Как ввести объект со свойствами, которые я переименовываю при его разрушении?

#typescript

Вопрос:

У меня есть это:

типы/PretaxAccount.ts

 export default interface PretaxAccount {
  account_info: object[];
  available_balance: string;
  display_options: string;
  account_type: string;
  submit_claims_last_date: string;
  effective_date: string;
}

 
 import PretaxAccount from 'types/PretaxAccount';

const getPretaxAccount = async ({
  account_type,
  flex_account_id,
}: {
  account_type: string;
  flex_account_id: string;
}) => {
  const {
    data: { account_detail_info: account },   // <---- notice how I'm renaming the property to "account"
  } = await PretaxAccountApi.fetchAccountDetail({
    account_id: flex_account_id,
    account_type,
  });
  return { account };
};

 

Я пытаюсь перевести значение account ключа в счет до вычета налогов. Как бы я это сделал? PretaxAccountApi.fetchAccountDetail-это запрос axios, если это поможет.

Ответ №1:

Вы не можете объявлять типы в левой части назначения при использовании деструктурирования. Для этого просто нет синтаксиса.

Но в идеале PretaxAccountApi.fetchAccountDetail вернул бы правильный тип, и вам не нужно было бы ничего записывать. Обычно требуется деструктировать значения с помощью строго типизированных фигур. Тогда Typescript просто делает правильные вещи без каких-либо дополнительных типов.

Если по какой-либо причине это невозможно, вы можете сначала сохранить результат в типизированной переменной:

 const result: { data: { account_detail_info: PretaxAccount } } =
  await PretaxAccountApi.fetchAccountDetail({
    account_id: flex_account_id,
    account_type,
  });

const {
  data: { account_detail_info: account },
} = result
 

Ответ №2:

В TypeScript вы можете использовать ключевое слово as или оператор <><> для приведения типов.

Вы можете найти краткое руководство с дополнительной информацией здесь, если вам интересно.

НО на самом деле я не думаю, что приведение типов необходимо для того, что вы пытаетесь сделать, учитывая, что значение учетной записи соответствует интерфейсу предварительного учета.

Вы собираетесь перевести учетную запись на счет до налогообложения и вернуть ее? Если это так, вы можете отбросить {}.

 return account;
 

Ваша проблема, скорее всего, связана с тем, что в возвращаемом значении у вас были скобки вокруг { account}. Я бы рекомендовал опустить скобки и добавить тип возвращаемого значения для функции «PretaxAccount», если это ваше намерение.

Кроме того, я бы выделил ваше определение параметров в отдельный интерфейс для удобства чтения. Личные предпочтения, но я думаю, что это немного легче читать, как это:

 interface AccountIdInfo {
  account_type: string;
  flex_account_id: string;
}

const getPretaxAccount = async (accountIdInfo: AccountIdInfo): PretaxAccount => {
  const { account_type, flex_account_id } = accountIdInfo;
  const {
    data: { account_detail_info: account },   // <---- notice how I'm renaming the property to "account"
  } = await PretaxAccountApi.fetchAccountDetail({
    account_id: flex_account_id,
    account_type,
  });
  return account;
};