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>
    }
  }
}