【发布时间】:2021-09-10 21:39:19
【问题描述】:
我有一个包含全局参数的对象。这些参数是我的组件使用的列表(数组或带有键的对象)。
某些参数由 2 个或更多组件共享。这些参数存储在GLOBALS.global[parameter-name] 中。
其他参数与组件相关,存放在GLOBALS.related[component-name][parameter-name]中。
const GLOBALS = {
// Used by 2 or more components
'global': {
'colors': ['red', 'blue', 'green', 'yellow'],
'icons': {
'home': 'icon-home',
'power': 'icon-power',
'server': 'icon-server',
}
},
// Related to components
'related': {
'component-1': {
'direction': ['left', 'right', 'up', 'down'],
},
'component-2': {
'direction': ['up', 'down'],
'icon-set': {
'arrow': { 'up': 'icon-arrow-up-1', 'down': 'icon-arrow-down-1' },
'arrow-simple': { 'up': 'icon-arrow-up-2', 'down': 'icon-arrow-down-2' },
'arrow-circle': { 'up': 'icon-arrow-up-3', 'down': 'icon-arrow-down-3' },
}
},
}
};
对于某些用户输入检查,我需要获取这些参数列表并检查用户输入是否有效。
例如:
getGlobalParamList('color') // => returns ['red', 'blue', 'green', 'yellow']
getGlobalParamList('icons') // => returns ['home', 'power', 'server']
getGlobalParamList('isNotDefined') // => error message
我写了这个函数:
const getGlobalParamList = (paramName: string): string[] => {
// Check if key paramName exist in GLOBALS
if (GLOBALS.global.hasOwnProperty(paramName)) {
const paramList = GLOBALS.global[paramName];
if (Array.isArray(paramList)) return paramList;
if (typeof paramList === 'object') return Object.keys(paramList);
console.error(`Global parameter name ${paramName} is neither an array nor an object.`);
return [];
}.
console.error(`Undefined global parameter name ${paramName}.`);
return [];
}
然后我得到打字稿错误: 该元素隐式属于“any”类型,因为该类型的表达式不能用于索引类型。
我尝试向对象声明类型Global,但这不起作用:
type Globals = {
[key: string]: string | object | string[] | object[]
}
当我将类型更改为 any 时,它可以工作,但是在 Visual Studio Code 中我的 GLOBALS 对象不再自动完成。
type Globals = {
[key: string]: any
}
有人猜怎么处理吗?在下一步中,我想创建一个函数来访问与组件相关的参数,例如getComponentParamList(componentName: string, paramName: string) :string[]。
【问题讨论】:
标签: typescript