TypeScript: Object.keys возвращает строку [] - PullRequest
0 голосов
/ 17 октября 2018

При использовании Object.keys(obj) возвращаемое значение равно string[], тогда как я хочу (keyof obj)[].

const v = {
    a: 1,
    b: 2
}

Object.keys(v).reduce((accumulator, current) => {
    accumulator.push(v[current]);
    return accumulator;
}, []);

У меня ошибка:

Элементнеявно имеет тип 'any', потому что type '{a: number;б: число;} 'не имеет индексной подписи.

TypeScript 3.1 с strict: true.Детская площадка: здесь , пожалуйста, отметьте все флажки в Options, чтобы активировать strict: true.

Ответы [ 3 ]

0 голосов
/ 17 апреля 2019

В качестве возможного решения вы можете выполнить итерацию, используя for..in для вашего объекта:

for (const key in myObject) {
  console.log(myObject[key].abc); // works!
}

Хотя это, как вы сказали, не будет работать:

for (const key of Object.keys(myObject)) {
  console.log(myObject[key].abc); // doesn't!
}
0 голосов
/ 14 мая 2019

Вы можете использовать тип утилиты Extract , чтобы согласовать ваш параметр только с теми ключами typeof obj, которые являются строками (какими бы они ни были).


    Object.keys(obj).forEach((key: Extract<keyof typeof obj, string>) => {
      const item = obj[key]
    })
0 голосов
/ 17 октября 2018

Object.keys возвращает string[].Это сделано так, как описано в этом выпуске

Это сделано намеренно.Типы в TS являются открытыми.Таким образом, keysof, вероятно, будет меньше всех свойств, которые вы получите во время выполнения.

Существует несколько решений, самое простое из которых - просто использовать утверждение типа:

const v = {
    a: 1,
    b: 2
};

var values = (Object.keys(v) as Array<keyof typeof v>).reduce((accumulator, current) => {
    accumulator.push(v[current]);
    return accumulator;
}, [] as (typeof v[keyof typeof v])[]);

Youтакже можно создать псевдоним для keys в Object, который будет возвращать нужный тип:

export const v = {
    a: 1,
    b: 2
};

declare global {
    interface ObjectConstructor {
        typedKeys<T>(o: T) : Array<keyof T>
    }
}
Object.typedKeys = Object.keys as any

var values = Object.typedKeys(v).reduce((accumulator, current) => {
    accumulator.push(v[current]);
    return accumulator;
}, [] as (typeof v[keyof typeof v])[]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...