【问题标题】:Object.keys using numbers in typescriptObject.keys 在打字稿中使用数字
【发布时间】:2019-11-10 05:54:57
【问题描述】:
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[]?在这里创建数字数组的正确方法是什么?
【问题讨论】:
标签:
javascript
arrays
typescript
object
ecmascript-6
【解决方案1】:
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】:
对象属性名称始终是字符串,如果您想即时将属性名称转换为数字,可以使用map(Number):
const sizes: number[] = Object.keys(foo).map(Number);
请注意,如果您的属性名称不能转换为数字,您将在 size 数组中获得 NaN
【解决方案3】:
为什么 Typescript 假设 string[]?什么是正确的方法
在这里创建一个数字数组?
因为对象属性名称始终是字符串(或者,为了正确解释,始终强制为字符串),因此默认签名假定 string[] 作为默认类型,正如智能感知甚至建议的那样:
此外,您无法确保在运行时这些键是数字。定义一个严格定义该对象以具有数字键的类型在运行时无效,因此将值安全地转换为所需的类型总是更安全:
const sizes: number[] = Object.keys(foo).map(Number); // beware of possible NaN here.
【解决方案4】:
Object.keys 总是返回一个由字符串组成的数组:
const obj = { prop: 'prop' };
console.log(typeof Object.keys(obj)[0]);
键始终是字符串,即使是数字键,如数组和 Foo 对象 - 如果您使用数字键而不是字符串键,它将自动强制转换为字符串。
我会改用[key: string],因为这是内部键的类型。
【解决方案5】:
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]);