首页 > 解决方案 > 从 TypeScript 中的类型中排除具有空对象类型的属性

问题描述

我在打字稿中有以下类型:

type Foo = {
             x: {}; 
             y: {bar: string};
             z: {};
};

如何删除所有空属性(即xz)以使生成的类型看起来像这样?

type Result = {
     y: {bar: string};
}

标签: typescript

解决方案


仅以您的一个示例为例,除了字面意思之外,您还不清楚哪些类型{}可以删除:例如,您需要保留还是删除object类型类型呢?_ unknown我不会太担心这个;只知道您可能应该遍历一组可能的边缘情况,并确定您提出的任何类型的行为是否可以接受。

无论如何,一种不依赖于导入外部库的可能实现是:

type DropEmpty<T> =
  { [K in keyof T as keyof T[K] extends never ? never : K]: T[K] };

这是使用映射类型中的键重新映射来抑制任何符合特定条件的属性,方法是将有问题的键重新映射到never.

您可以验证这是否符合您的示例所需的行为:

type Result = DropEmpty<Foo>
/*type Result = {
    y: {
        bar: string;
    };
} */

Playground 代码链接


推荐阅读