Object.keys, используя числа в машинописи - PullRequest
1 голос
/ 28 июня 2019
type Foo = { [key: number]: string }

const foo: Foo = { 100: 'foo', 200: 'bar' }
const sizes: number[] = Object.keys(foo)

Дает мне:

Type 'string[]' is not assignable to type 'number[]

Почему Typescript принимает string[]?И как правильно создать здесь массив чисел?

Ответы [ 5 ]

3 голосов
/ 28 июня 2019

Имена свойств объекта всегда строковые, если вы хотите преобразовать имена свойств в числа на лету, вы можете использовать map(Number):

const sizes: number[] = Object.keys(foo).map(Number);

Обратите внимание, потому что, если имя вашего свойства не можетбудь конвертер в число, вы получите NaN в вашем массиве размеров

2 голосов
/ 28 июня 2019

Все ключи являются строками в JavaScript - просто используйте map:

const sizes: number[] = Object.keys(foo).map(Number);

Это будет работать только для числовых строк - если это европейская строка с десятичными знаками, например, это будет NaN, и что никогда не заканчивается хорошо.

console.log(Number("10,7"));

Или измените любой из ваших типов:

const sizes: string[] = Object.keys(foo);

Или:

type Foo = { [key: string]: string };
0 голосов
/ 28 июня 2019

Почему Typescript принимает строку []? И каков правильный способ создать массив чисел здесь?

Поскольку имена свойств объекта всегда являются строками (или, чтобы правильно объяснить это, всегда приводят к строкам), следовательно, подпись по умолчанию предполагает string[] в качестве типа по умолчанию, поскольку intellisense даже предлагает:

enter image description here

Кроме того, вы не можете гарантировать, что во время выполнения эти ключи будут числами . Определение типа, который строго определяет, что объект должен иметь числовые ключи , не имеет никакого эффекта во время выполнения , поэтому всегда безопаснее безопасно приводить значения к нужному типу:

const sizes: number[] = Object.keys(foo).map(Number); // beware of possible NaN here.
0 голосов
/ 28 июня 2019

Javascript Object не имеет цифровых клавиш! Все ключи являются строками. Всегда. Если вы хотите отобразить другие вещи в значения, вы должны использовать map.

var numObj = { 1:'one', 2:'two' };
var numObjKey = Object.keys(numObj);

console.log(typeof numObjKey[0]);
console.log(typeof numObjKey.map(Number)[0]);
0 голосов
/ 28 июня 2019

Object.keys всегда возвращает массив строк :

const obj = { prop: 'prop' };
console.log(typeof Object.keys(obj)[0]);

Ключи всегда являются строками, даже цифровыми, как с массивами и с вашим объектом Foo - если вы используете числовой ключ, а не строковый ключ, он будет автоматически приведен к строке.

Вместо этого я бы использовал [key: string], потому что это тот тип ключей, который используется внутри.

...