在 TypeScript 中按值获取对象的键

要在 TypeScript 中按值获取对象的键:

  1. 使用 Object.keys() 方法获取对象键的数组。
  2. 键入数组作为对象键的数组。
  3. 使用 find() 方法通过值获取键。
const obj = {
  name: 'Tom',
  department: 'accounting',
  country: 'Chile',
};

// ✅ Using Object.keys()
const result1 = (Object.keys(obj) as (keyof typeof obj)[]).find((key) => {
  return obj[key] === 'accounting';
});

console.log(result1); // ?️ "department"

// ✅ Using Object.entries()
let result2 = '';

Object.entries(obj).find(([key, value]) => {
  if (value === 'accounting') {
    result2 = key;
    return true;
  }

  return false;
});

console.log(result2); // ?️ "department"

在 TypeScript 中按值获取对象的键

代码片段中的两个示例都按值获取对象的键。

我们在第一个示例中使用了 Object.keys 方法。 该方法返回对象键的数组。

const obj = {
  name: 'Tom',
  department: 'accounting',
  country: 'Chile',
};

// 👇️ const r: string[]
const r = Object.keys(obj);
console.log(r); // 👉️ ['name', 'department', 'country']

但是,请注意 TypeScript 将 Object.keys() 方法的返回值类型为 string[]

对象的所有键都是字符串,但并非所有字符串都是对象中的键,因此我们无法直接通过键访问值。

const obj = {
  name: 'Tom',
  department: 'accounting',
  country: 'Chile',
};

// 👇️ const r: string[]
const r = Object.keys(obj).find((key) => {
  // ⛔️ Error:  No index signature with a parameter of
  // type 'string' was found on type
  // '{ name: string; department: string; country: string; }'.
  return obj[key] === 'accounting';
});

TypeScript 告诉我们不能用任何字符串键索引对象,它必须是 name 、department 或 country

这就是我们使用类型断言来键入 Object.keys() 方法的返回值的原因。

const obj = {
  name: 'Tom',
  department: 'accounting',
  country: 'Chile',
};

// now the `key` parameter is typed as
// 👇️ (parameter) key: "name" | "department" | "country"
const result1 = (Object.keys(obj) as (keyof typeof obj)[]).find((key) => {
  return obj[key] === 'accounting';
});

console.log(result1); // 👉️ "department"

现在 find 方法中的 key 参数是对象键的联合类型,所以一切都按预期工作。

我们传递给 Array.find 方法的函数被键数组中的每个元素调用,直到它返回一个真值或遍历整个数组。

如果满足条件,则 find() 方法返回相应的数组元素并短路。

如果条件永远不满足,find() 返回 undefined 。

我们还可以使用 Object.entries() 方法通过值获取对象的键。

const obj = {
  name: 'Tom',
  department: 'accounting',
  country: 'Chile',
};

let result2 = '';

Object.entries(obj).find(([key, value]) => {
  if (value === 'accounting') {
    result2 = key;
    return true;
  }

  return false;
});

console.log(result2); // 👉️ "department"

请注意 ,在使用这种方法时,我们不必使用类型断言。

Object.entries() 方法返回一个键值对数组。

const obj = {
  name: 'Tom',
  department: 'accounting',
  country: 'Chile',
};

// 👇️ const r: [string, string][]
const r = Object.entries(obj);

// 👇️ [['name', 'Tom'], ['department', 'accounting'], ['country', 'Chile']]
console.log(r);

这很有用,因为我们不必使用类型断言,因为我们得到了一个由 2 个元素组成的数组 – 键和值。

find() 方法返回满足条件的数组元素或未定义的值,我们只需要键,因此更简单:

  1. 在方法之外初始化一个变量
  2. 满足条件后设置其值
  3. 短路