我有以下TypeScript代码。这是一个带有一些specialKey
键的深层嵌套对象。
const obj = {
THIS: {
IS: {
MY: {
OBJECT: {
DUDE: {
specialKey: 'foo',
},
specialKey: 'bar',
},
},
},
CANNOT: {
BE: {
specialKey: 'baz',
},
},
},
};
我有一个解析此结构的函数,并生成一个对象,该对象将具有specialKey
键的键串联在一起。
const result = parseObj(obj);
/*
result = {
THIS_IS_MY_OBJECT: true,
THIS_IS_MY_OBJECT_DUDE: true,
THIS_CANNOT_BE: true,
}
*/
以下是参考功能:
const parseObj = (obj: {}): any => {
const root = {};
const inner = (obj, prefix = ''): void => {
Object.keys(obj).forEach(key => {
if (key === 'specialKey') {
root[prefix] = true;
} else if (key === key.toUpperCase()) {
inner(obj[key], prefix === '' ? key : `${prefix}_${key}`);
}
});
};
inner(obj);
return root;
};
因此该代码有效,但是由于它是如此动态,因此我需要使用any
作为返回类型,因此result
没有Intellisense,因此无法键入result.~~~~
并获取上述对象键的代码完成。是否可以创建类型或重新编写函数,所以我不需要使用any
?
答案 0 :(得分:0)
我知道无法实现这一目标; TypeScript并不是那么动态。
但是,根据您的示例,值始终为布尔值,因此您可以略微改善返回类型:
interface ObjectSummary {
[key:string]: boolean
}
const parseObj = (obj: {}): ObjectSummary => {
const root: ObjectSummary = {};
// ...