【问题标题】: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]);

          【讨论】:

            猜你喜欢
            • 2019-11-14
            • 1970-01-01
            • 1970-01-01
            • 2017-08-20
            • 2013-08-07
            • 2021-12-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多