TypeScript
April 15
Определение типа ключа объекта в Typescript
В TypeScript Record
- это общий способ выражения типа объекта. Например:
interface Entity { issues: Record<string, Issue> }
Недостаток использования Record
в некоторых случаях заключается в том, что теряется преимущество выражения значения ключа. Рассмотрим следующий пример:
interface Lambda { id: string; name: string; } interface Metric { timestamp: number; value: number; } interface LambdasResponse { data: { entities: Lambda[]; metrics: { memory: Record<string, Metric> } } }
При просмотре этого кода я не могу узнать, что тип string
внутри объекта memory Record
относится к идентификатору Lambda
.
Есть два возможных решения. Первое - использовать индексную сигнатуру:
interface LambdasResponse { data: { entities: Lambda[]; metrics: { memory: { [lambdaId: string]: Metric } } } }
Этот подход имеет преимущество в том, что вы можете выбирать имя свойства. Следовательно, вы ограничены использованием типа string
, number
или symbol
.
Второй подход - указать тип непосредственно для идентификатора Lambda
:
interface LambdasResponse { data: { entities: Lambda[]; metrics: { memory: Record<Lambda['id'], Metric> } } }