我真的需要能够动态检查aa是否是我的复杂对象的属性,称为验证
const check = 'propertya' + 'a'; // result of a complex calculation that returns string 'propertyaa'
validations= {
'a' : {
'propertyaa': 'ax',
'ab': 'ay',
'ac': 'az'
},
'b' : {
'ba': 'ax',
'bb': 'ay',
'bc': 'az'
}
};
if (this.validations.a[check] === undefined) { ...
错误是:
element implicitly has an any type because type '{ ' propertyaa': string, 'ab': string, 'ac': string; }' has no index signature
(property) 'a': {
'propertyaa': string;
'ab': string;
'ac': string;
}
奇怪的是,静态(非动态)变体有效if (this.validations.a['ab']) {
答案 0 :(得分:1)
您可以选择其中一条路线。您可以向验证属性添加索引签名:
type Indexable = { [name: string]: string }
const validations = {
'a': {
'propertyaa': 'ax',
'ab': 'ay',
'ac': 'az'
} as Indexable,
'b': {
'ba': 'ax',
'bb': 'ay',
'bc': 'az'
} as Indexable
};
const check = 'propertya' + 'a';
if (validations.a[check] === undefined) {
}
您还可以在使用时将属性转换为Indexable
:
if ((validations.a as Indexable)[check] === undefined) {
}
您也可以使用any
代替Indexable
,但上面定义的Indexable
提供更多类型安全性,然后any
另一种选择是断言字符串check
实际上是a
值的关键:
if (validations.a[check as 'propertyaa'] === undefined) {
}
修改强>
如果使用第一个选项,辅助函数可以帮助避免在validations
的每个属性上使用类型断言:
type Indexable = { [name: string]: string }
const validations = createValidations({
'a': {
'propertyaa': 'ax',
'ab': '19',
'ac': 'az'
},
'b': {
'ba': 'ax',
'bb': 'ay',
'bc': 'az'
}
});
function createValidations<T>(o: { [P in keyof T]: T[P] & Indexable}) : typeof o {
return o;
}
const check = 'propertya' + 'a';
if (validations.a[check] === undefined) {
}
答案 1 :(得分:0)
您需要index signature ...
interface ComplexObject {
[index: string ]: string | ComplexObject;
}
const check = 'propertya' + 'a';
const validations: ComplexObject = {
'a' : {
'propertyaa': 'ax',
'ab': 'ay',
'ac': 'az'
},
'b' : {
'ba': 'ax',
'bb': 'ay',
'bc': 'az'
}
};
if (this.validations.a[check] === undefined) {
// ...
}
答案 2 :(得分:0)
有一个更简单的解决方案,到目前为止唯一适用于我的解决方案:
cartoons = {
'producers': {
'Disney': 'Walt Disney',
'PIXAR1': 'John John'
}
}
const check = 'Dis' + 'ney';
const y = (<any>this.cartoons.producers)[check]; // notice the cast to any
alert(y);