将 Typescript 接口的键作为字符串数组获取

2022-08-30 00:29:25

我在Lovefield中有很多表,以及它们各自的接口,用于了解它们具有的列。

例:

export interface IMyTable {
  id: number;
  title: string;
  createdAt: Date;
  isDeleted: boolean;
}

我希望将此接口的属性名称放在如下所示的数组中:

const IMyTable = ["id", "title", "createdAt", "isDeleted"];

我无法直接基于接口创建一个对象/数组,这应该可以做到这一点,因为我会动态获取表的接口名称。因此,我需要在接口中迭代这些属性,并从中获取一个数组。IMyTable

如何实现此结果?


答案 1

TypeScript 2.3开始(或者我应该说2.4,因为在2.3中,这个功能包含一个typescript@2.4-dev中修复的错误),你可以创建一个自定义转换器来实现你想要做的事情。

实际上,我已经创建了这样一个自定义转换器,它支持以下功能。

https://github.com/kimamula/ts-transformer-keys

import { keys } from 'ts-transformer-keys';

interface Props {
  id: string;
  name: string;
  age: number;
}
const keysOfProps = keys<Props>();

console.log(keysOfProps); // ['id', 'name', 'age']

不幸的是,定制变压器目前并不那么容易使用。您必须将它们与TypeScript转换API一起使用,而不是执行tsc命令。请求对自定义转换器的插件支持时出现问题。


答案 2

也许为时已晚,但在TypeScript的2.1版本中,您可以使用以下命令来获取类型:keyof

interface Person {
    name: string;
    age: number;
    location: string;
}

type K1 = keyof Person; // "name" | "age" | "location"
type K2 = keyof Person[];  // "length" | "push" | "pop" | "concat" | ...
type K3 = keyof { [x: string]: Person };  // string

资料来源:https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-1.html#keyof-and-lookup-types