TypeScript
April 15, 2024
Определение типа ключа объекта в 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>
}
}
}