如果string是复杂对象的属性,则actionscript动态检查

时间:2018-05-02 14:26:16

标签: javascript typescript

我真的需要能够动态检查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']) {

3 个答案:

答案 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);