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

Dav*_*ing 10 javascript arrays object typescript ecmascript-6

type Foo = { [key: number]: string }

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

给我:

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

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

Jac*_*ord 14

JavaScript 中的所有键都是字符串 - 只需使用map

const sizes: number[] = Object.keys(foo).map(Number);
Run Code Online (Sandbox Code Playgroud)

这仅适用于数字字符串 - 例如,如果它是一个涉及小数的欧洲字符串,它将是NaN,并且永远不会结束。

const sizes: number[] = Object.keys(foo).map(Number);
Run Code Online (Sandbox Code Playgroud)

或者更改您的任何一种类型:

const sizes: string[] = Object.keys(foo);
Run Code Online (Sandbox Code Playgroud)

或者:

type Foo = { [key: string]: string };
Run Code Online (Sandbox Code Playgroud)


bri*_*eje 6

为什么 Typescript 假定为 string[]?在这里创建数字数组的正确方法是什么?

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

在此输入图像描述

此外,您无法确保在运行时这些键将是数字。定义严格定义该对象具有数字键的类型在运行时不会产生任何影响,因此将值安全地转换为所需类型总是更安全:

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


Cri*_*ìna 5

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

const sizes: number[] = Object.keys(foo).map(Number);
Run Code Online (Sandbox Code Playgroud)

请注意,如果您的属性名称不能转换为数字,您将进入NaNsize 数组