Типы функции проекции, используемые с OData [duplicate]

Для исправления такой проблемы я использовал ниже код

a.divide(b, 2, RoundingMode.HALF_EVEN)

2 - точность. Теперь проблема решена.

1
задан Jason Spradlin 4 March 2018 в 04:00
поделиться

1 ответ

Ты довольно близок; вы ищете сопоставленные типы , которые позволяют выполнять итерацию по клавишам (в отличие от использования индексатора). То есть, не используйте это:

{[key: K]: IResources[K]}

используйте это вместо:

{[P in K]: IResources[P]}

На самом деле, это достаточно полезная конструкция, которая существует в стандартная библиотека as Pick<T,K>:

Pick<IResources, K>

Таким образом, ваша функция станет чем-то вроде:

export function mapResources<K extends keyof IResources>(resources: IResources, keys: K[]): Pick<IResources, K> {
  return keys.reduce((response, key) => ({
      ...response,
      [key as string]: resources[key]
  }), {});
}

Это не сможет ввести проверку в реализацию, потому что я не знаю Не думайте, что TypeScript понимает тип распространения на Pick<IResources, K>. Если вы уверены, что все в реализации в порядке, вы можете использовать утверждения any, чтобы помочь:

export function mapResources<K extends keyof IResources>(resources: IResources, keys: K[]): Pick<IResources, K> {
  return keys.reduce((response, key) => ({
      ...(response as any),
      [key]: resources[key]
  }), {});
}

Вы можете проверить, что это ведет себя по желанию (я не могу легко это сделать без зная, что IResources). Надеюсь, это поможет; удачи!

3
ответ дан jcalz 15 August 2018 в 21:38
поделиться
  • 1
    response as any было тем же, что мне нужно было сделать, когда я обнаружил это самостоятельно. Это решение, и вы опубликовали его в то же время, что и я! – Jason Spradlin 4 March 2018 в 04:37
  • 2
    Наверное, я изучаю что-то новое, чего я не понимал в TypeScript. Значит ли это, что такой тип: type Keys = 'option1' | 'option2' можно рассматривать как тип, где допускаются только эти две строки и как постоянный массив этих двух строк? – kshetline 4 March 2018 в 04:56
Другие вопросы по тегам:

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