Skip to content

迭代中正确使用对象键

Problem

typescript
type User = {
  name: string;
  age: number;
};

function printUser(user: User) {
  Object.keys(user).forEach((key) => {
    // Error
    // Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'User'
    console.log(user[key]);
  });
}

Solution 1

Casting to keyof typeof

typescript
const user = {
  name: "Daniel",
  age: 26,
};

const keys = Object.keys(user);

keys.forEach((key) => {
  console.log(user[key as keyof typeof user]);
});

Solution 2

类型保护

typescript
function isKey<T extends object>(x: T, k: PropertyKey): k is keyof T {
  return k in x;
}

keys.forEach((key) => {
  if (isKey(user, key)) {
    console.log(user[key]);
  }
});

Solution 3

将 object.keys 包装在一个返回转换类型值的函数中

typescript
type User = {
  name: string;
  age: number;
};

const objectKeys = <T extends object>(obj: T) => {
  return Object.keys(obj) as Array<keyof T>;
};

const object: User = {
  name: "daniel",
  age: 26,
};

const keys = objectKeys(object).map((key) => console.log(object[key]));
2025( )
今日 29.17%
本周 57.14%
本月 32.26%
本年 52.33%
Powered by Snowinlu | Copyright © 2024- | MIT License