繁体   English   中英

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

[英]Object.keys using numbers in typescript

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[] 在这里创建数字数组的正确方法是什么?

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

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

请注意,因为如果您的属性名称不能转换为数字,则尺寸数组中将显示NaN

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

Object.keys总是返回一个字符串数组:

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

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

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

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]); 

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

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

在此处输入图片说明

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM