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

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)


Dav*_*ett 5

为了稍微扩展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)

  • `keyof any` 与 `string | 相同 数量 | 符号`。或者您可以使用内置的“PropertyKey”类型。 (2认同)