如何获取打字稿记录中的值的键

Posted

技术标签:

【中文标题】如何获取打字稿记录中的值的键【英文标题】:How do I get the key of a value in a Typescript Record 【发布时间】:2020-03-14 16:16:23 【问题描述】:

代码如下:

export type Period = 'dy' | 'wk' | 'mn' | 'qt' | 'yr';

const periods: Record<Period, string> = 
    dy: 'Day',
    wk: 'Week',
    mn: 'Month',
    qt: 'Quarter',
    yr: 'Year'
  ;

当我尝试这样做时:

const key = Object.keys(periods).find(key =&gt; periods[key] === 'Day');

我当然会得到一个错误,因为periods[key] 不能保证key 是正确的类型。我应该怎么做呢?我想到了一个枚举,但我不能进行反向查找。我想要实现的只是一个显示“Day”但键为dy(等)的输入字段,并且可以将状态设置为正确的键,而不是用户选择另一个值时的值。

【问题讨论】:

【参考方案1】:

Object.keys 返回string[] 而不是Array&lt;keyof T&gt;(其中T 是传入值的类型)。原因在here 中概述。

由于您的对象可能不会有未知键,您可以使用类型断言:

export type Period = 'dy' | 'wk' | 'mn' | 'qt' | 'yr';

const periods: Record<Period, string> = 
  dy: 'Day',
  wk: 'Week',
  mn: 'Month',
  qt: 'Quarter',
  yr: 'Year'
;

const key = (Object.keys(periods) as Array<Period>).find(key => periods[key] === 'Day');

Playground Link

【讨论】:

问题在于Array&lt;Period&gt; 包含undefined,这也会报错。 @Sammy 你从哪里得到undefined?我发布的代码示例按原样工作。 Object.keys(periods) 返回的数组不应包含 undefined 哦,对不起,那是因为我试图将键设置为另一个函数中的值,但如果找不到它们的值,find 可能确实返回undefined。我会处理的。非常感谢! 为了我的需要而反其道而行之,这也奏效了。 typescript type Period = 'dy' | 'wk' | 'mn' | 'qt' | 'yr'; const periods: Record&lt;Period, string&gt; = dy: 'Day', wk: 'Week', mn: 'Month', qt: 'Quarter', yr: 'Year' ; const key = (Object.values(periods) as Array&lt;string&gt;).find(val =&gt; val == periods.dy); console.log(key); // Returns "Day" 【参考方案2】:

我发现自己需要多次解决这个问题。我有一些实用工具可以提供帮助。

这就是我会做的。

const _periods = 
  dy: 'Day',
  wk: 'Week',
  mn: 'Month',
  qt: 'Quarter',
  yr: 'Year',
 as const;

export type Period = keyof typeof _periods;
export type PeriodValue = typeof _periods[Period];

export const periods = _periods as Record<Period, PeriodValue>;

function keys<T>(object: T) 
  return Object.keys(object) as (keyof T)[];
;

const key = keys(periods).find((key) => periods[key] === 'Day');

// Compile error, value not possible.
const badValueKey = keys(periods).find((key) => periods[key] === 'Minute');

【讨论】:

以上是关于如何获取打字稿记录中的值的键的主要内容,如果未能解决你的问题,请参考以下文章

具有定义值的打字稿动态对象键

如何从打字稿中的json响应中获取日期对象

打字稿 |从对象 T 中提取具有类型 K 值的所有键名

如何使用打字稿中的查找来推断类型化的 mapValues?

如何从打字稿中的数组中获取键[重复]

具有未知键的对象的打字稿类型,但只有数值?