在打字稿中使用数字的Object.keys

时间:2019-06-28 09:13:00

标签: javascript arrays typescript object ecmascript-6

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[]

为什么打字稿采用string[]?在这里创建数字数组的正确方法是什么?

5 个答案:

答案 0 :(得分:3)

对象属性名称始终是字符串,如果您想将属性名称转换为数字,可以使用map(Number)

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

请注意,因为如果您的属性名称不能转换为数字,则会在您的尺寸数组中得到NaN

答案 1 :(得分:2)

所有键都是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 };

答案 2 :(得分:0)

Object.keys总是返回 strings 的数组:

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

键始终是字符串,甚至是数组和Foo对象中的数字键-如果您使用数字键而不是字符串键,它将自动强制为字符串。

我会改用[key: string],因为这是内部键的类型。

答案 3 :(得分:0)

Javascript对象没有数字键!所有键都是字符串。始终。如果要将其他内容映射到值,则应使用map

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

console.log(typeof numObjKey[0]);
console.log(typeof numObjKey.map(Number)[0]);

答案 4 :(得分:0)

  

为什么打字稿采用字符串[]?正确的方法是什么   在这里创建数字数组?

因为对象属性名称始终是字符串(或者为了正确解释,总是被强制强制为字符串),因此默认签名将string[]假定为默认类型,如智能感知甚至建议:

enter image description here

此外,您不能确保在运行时这些键将是数字。将类型严格定义为具有数字键的对象在运行时无效,因此将值安全地强制转换为所需类型总是更安全:

const sizes: number[] = Object.keys(foo).map(Number); // beware of possible NaN here.