如何获取打字稿记录中的值的键
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 => periods[key] === 'Day');
我当然会得到一个错误,因为periods[key]
不能保证key
是正确的类型。我应该怎么做呢?我想到了一个枚举,但我不能进行反向查找。我想要实现的只是一个显示“Day”但键为dy
(等)的输入字段,并且可以将状态设置为正确的键,而不是用户选择另一个值时的值。
【问题讨论】:
【参考方案1】:Object.keys
返回string[]
而不是Array<keyof T>
(其中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<Period>
包含undefined
,这也会报错。
@Sammy 你从哪里得到undefined
?我发布的代码示例按原样工作。 Object.keys(periods)
返回的数组不应包含 undefined
哦,对不起,那是因为我试图将键设置为另一个函数中的值,但如果找不到它们的值,find
可能确实返回undefined
。我会处理的。非常感谢!
为了我的需要而反其道而行之,这也奏效了。 typescript 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.values(periods) as Array<string>).find(val => 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');
【讨论】:
以上是关于如何获取打字稿记录中的值的键的主要内容,如果未能解决你的问题,请参考以下文章