Sam*_*mmy 13 javascript typescript reactjs
这是代码:
export type Period = 'dy' | 'wk' | 'mn' | 'qt' | 'yr';
const periods: Record<Period, string> = {
dy: 'Day',
wk: 'Week',
mn: 'Month',
qt: 'Quarter',
yr: 'Year'
};Run Code Online (Sandbox Code Playgroud)
当我尝试这样做时:
const key = Object.keys(periods).find(key => periods[key] === 'Day');
我当然得到一个错误,因为periods[key]不能保证它key是正确的类型。我真的应该怎么做?我想到了一个枚举,但我无法进行反向查找。我想要实现的只是一个输入字段,它显示“天”但有一个键dy(等),并且可以将状态设置为正确的键而不是用户选择另一个值时的值。
Tit*_*mir 21
Object.keys返回string[]不Array<keyof T>(其中T是传入值的类型)。此处概述了原因。
由于您的对象可能不会有未知键,您可以使用类型断言:
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');
Run Code Online (Sandbox Code Playgroud)
小智 10
我发现自己多次需要解决这个问题。我有一些实用程序可以提供帮助。
这就是我要做的。
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');
Run Code Online (Sandbox Code Playgroud)
为了稍微扩展Daniel Raby的答案 - 我有这些实用函数用于根据 Record<> 键入的键和条目...
export function recordKeys<K extends PropertyKey, T>(object: Record<K, T>) {
return Object.keys(object) as (K)[];
};
export function recordEntries<K extends PropertyKey, T>(object: Record<K, T>) {
return Object.entries(object) as ([K,T])[];
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22121 次 |
| 最近记录: |