在typescript定义Object不使用any?

作者站长头像
站长
· 阅读数 9

我想实现这样的函数:判断一个字符串是否是一个对象的key

/**
 * 判断key是否存在Object中
 * @param key
 * @param object
 * @returns boolean
 */
export function isValidKey(key: string | number | symbol, object: any): key is keyof typeof object {
  return key in object;
}

请问可以怎样更好的定义这里的object的类型呢?(不使用any)补充一下,我的应用场景是这样的:我定义了一个复杂的对象Item,结构大致如下:

interface Item {
  name: string;
  title: string;
  display: boolean;
  props: ItemProps;
  state?: ItemProps;
}
interface ItemProps{
  [key: string]: {
    title: string;
    type: string;
    val: any;
  };
}

我需要动态的去获取Item的props或者state下的某个值,比如:item.props.open.val,因为是动态的设置,所以其中的props、open、val都是通过参数传递过来的,我在函数中这样写的:

if (
  key1 in item &&
  key2 in item[key1] &&
  key3 in item[key1][key2]
) {
  const params = {
    props: [
      {
        type: currentBind.deviceProp,
        val: item[key1][key2][key3]
      }
    ]
  };
  console.log('params', params);
}

然后ts报错:有 "any" 类型,因为类型为 "string" 的表达式不能用于索引类型 "Item"。在类型 "Item找不到具有类型为 "string" 的参数的索引签名。为了解决这个问题,我就想通过最开始提到的公共方法去处理:

if (
  isValidKey(key1, item) &&
  isValidKey(key2, item[key1]) &&
  isValidKey(key3, item[key1][key2])
) {
  const params = {
    props: [
      {
        type: currentBind.deviceProp,
        val: item[key1][key2][key3]
      }
    ]
  };
  console.log('params', params);
}
回复
1个回答
avatar
test
2024-07-01
/**
 * 判断key是否存在Object中
 */
export function isValidKey(key: string | number | symbol, object: object): boolean {
    return key in object;
}
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容