如何将类型对象键转换为打字稿中的字符串类型数组

Chr*_*ett 12 typescript

在打字稿中给出以下输入:

type InputObjectType = {
  a: string
  b: number
  c: {}
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到以下类型:

type ObjectKeysArrayType = ['a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)

到目前为止我只能到达:

type AllPossibleKeys = (keyof InputObjectType)[]
Run Code Online (Sandbox Code Playgroud)

这给了我["a" | "b" | "c"]这很接近,但不是我在这种情况下寻找的。

我需要一个始终包含给定类型对象中的所有键字符串的数组。我知道强制执行此操作的唯一方法,例如,当用户向对象添加新键时,该键也添加到数组中,就是通过类似这样的方法。

Geo*_*rge 5

不确定您是否仍在此处寻找解决方案,但希望这会有所帮助。

如果您想要的类型要求变量是仅包含等于对象键的值的字符串数组,那么您列出的应该有效。

type InputObjectType = {
  a: string
  b: number
  c: {}
}

type AllPossibleKeys = (keyof InputObjectType)[]
Run Code Online (Sandbox Code Playgroud)

AllPossibleKeys将是等于 的类型("a"|"b"|"c")[]。这看起来就是您所要求的,但我猜测您想如何使用它有一个警告。

const fieldArray1: AllPossibleKeys = ['a', 'b', 'c']; //valid
const fieldArray2: AllPossibleKeys = ['a', 'b', 'c', 'd']; //will throw a Typescript error
const fieldArray3: AllPossibleKeys = ['a', 'b']; //this is also valid though as each member is a valid value
Run Code Online (Sandbox Code Playgroud)

如果您想要一个类型中所有键的数组,据我所知,没有办法明确执行此操作。但是,如果您能够使用接口而不是类型,那么您可以执行以下操作:

import { keys } from 'lodash';

interface InputObject = {
  a: string
  b: number
  c: {}
}

class InputObjectStub implements InputObject {
  a = null;
  b = null;
  c = null;
}

const fieldArray1 = keys(new InputObjectStub()); //returns ['a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)

但请注意,这不会强制执行可选属性。如果您需要这样做,请将您的类定义更改为class InputObjectStub implements Required<InputObject> {...

编辑:拼写


chi*_*iya -1

尝试这个

const object1 = {
  a: 'somestring',
  b: 42,
  c: false
};

console.log(Object.keys(object1));

output: Array ["a", "b", "c"]
Run Code Online (Sandbox Code Playgroud)