在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个回答

test
2024-07-01
/**
* 判断key是否存在Object中
*/
export function isValidKey(key: string | number | symbol, object: object): boolean {
return key in object;
}
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容