2017-02-02 2 views
2

В машинописном тексте, как получить доступ к ключу объекта (свойство) с помощью переменной?Ключ объекта доступа с использованием переменной в машинописном тексте

, например:

interface Obj { 
    a: Function; 
    b: string; 
} 

let obj: Obj = { 
    a: function() { return 'aaa'; }, 
    b: 'bbbb' 
} 

for(let key in obj) { 
    console.log(obj[key]); 
} 

но машинопись броска ниже сообщение об ошибке:

'TS7017 элемент неявно имеет 'любой' типа, так как тип 'Obj' не имеет индексный подпись'

Как это исправить?

ответ

3

Для компиляции этого кода с --noImplicitAny, вам нужно иметь какой-то версии типа проверены на Object.keys(obj) функции, типа проверяются в том смысле, что это известно, возвращать только имена свойств, определенных в obj.

Там нет такой функции, встроенной в машинописном AFAIK, но вы можете предоставить свой собственный:

interface Obj { 
    a: Function; 
    b: string; 
} 

let obj: Obj = { 
    a: function() { return 'aaa'; }, 
    b: 'bbbb' 
}; 


function typedKeys<T>(o: T): (keyof T)[] { 
    // type cast should be safe because that's what really Object.keys() does 
    return Object.keys(o) as (keyof T)[]; 
} 


// type-checked dynamic property access 
typedKeys(obj).forEach(k => console.log(obj[k])); 

// verify that it's indeed typechecked 
typedKeys(obj).forEach(k => { 
    let a: string = obj[k]; // error TS2322: Type 'string | Function' 
          // is not assignable to type 'string'. 
          // Type 'Function' is not assignable to type 'string'. 
}); 
0

Я пробовал свой код выше как быстрый тест в WebStorm, и он скомпилирован и работает без ошибок. Если вы используете версию TypScript до 2.0, я предлагаю попробовать TypScript 2.0 или выше.