我想实现这样的函数:判断一个字符串是否是一个对象的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);
}