在typescript定义Object不使用any?

我想实现这样的函数:判断一个字符串是否是一个对象的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.8k
2 个回答
/**
 * 判断key是否存在Object中
 */
export function isValidKey(key: string | number | symbol, object: object): boolean {
    return key in object;
}

在线演示

function isValidKey(key: string | number | symbol, object: Record<string | number | symbol, unknown>): key is keyof typeof object {
  return key in object;
}
console.log(isValidKey('a', { 'a': 'a' }))
const b = Symbol()
console.log(isValidKey(b, { [b]: 2 }))
logo
Microsoft
子站问答
访问
宣传栏