Для исправления такой проблемы я использовал ниже код
a.divide(b, 2, RoundingMode.HALF_EVEN)
2 - точность. Теперь проблема решена.
Ты довольно близок; вы ищете сопоставленные типы , которые позволяют выполнять итерацию по клавишам (в отличие от использования индексатора). То есть, не используйте это:
{[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
). Надеюсь, это поможет; удачи!
response as any
было тем же, что мне нужно было сделать, когда я обнаружил это самостоятельно. Это решение, и вы опубликовали его в то же время, что и я! – Jason Spradlin 4 March 2018 в 04:37type Keys = 'option1' | 'option2'
можно рассматривать как тип, где допускаются только эти две строки и как постоянный массив этих двух строк? – kshetline 4 March 2018 в 04:56