首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何过滤掉类型中的所有对象?

如何过滤掉类型中的所有对象?
EN

Stack Overflow用户
提问于 2021-10-11 12:47:46
回答 2查看 203关注 0票数 1

我有一种类型,FilteredType,它看起来像这样:

代码语言:javascript
复制
type ArrayKeys<T> = { [K in keyof T]: T[K] extends Array<any> ? K : never }[keyof T];

interface MyInterface {
    a: number;
    b: string;
    c: string;
    d: string[];
    e: number[];
    f: { // How can I filter out 'object' properties such as this in addition to arrays?
        g: number;
        h: string;
    }
}

type FilteredType = Omit<MyInterface, ArrayKeys<MyInterface>>;

除了筛选出数组之外,我还想筛选出诸如'f‘这样的复杂对象属性。这有可能吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-11 13:08:14

如果你要颠倒你的逻辑,只保留“原始”值,它就会自行解决。请参阅KeysOfPrimitive,您可以进一步扩展它,只允许指定类型的KeysOfSpecified

代码语言:javascript
复制
type primitives = null | undefined | string | number | symbol | boolean | bigint;
type KeysOfPrimitive<T extends Record<any, any>> = { [K in keyof T]: T[K] extends primitives ? K : never }[keyof T];
type KeysOfSpecified<T extends Record<any, any>, ToKeep> = { [K in keyof T]: T[K] extends ToKeep ? K : never }[keyof T];

interface MyInterface {
    a: number;
    b: string;
    c: string;
    d: string[];
    e: number[];
    f: {
        g: number;
        h: string;
    }
}

type T1 = Pick<MyInterface, KeysOfPrimitive<MyInterface>>;
type T2 = Pick<MyInterface, KeysOfSpecified<MyInterface, string>>;
type T3 = Pick<MyInterface, KeysOfSpecified<MyInterface, number[]>>;

游乐场

票数 1
EN

Stack Overflow用户

发布于 2021-10-11 13:53:48

数组是对象,因此可以使用类型进行筛选,这意味着“任何不是原语的东西”:

代码语言:javascript
复制
type ObjectKeys<T> = { [K in keyof T]: T[K] extends object ? K : never }[keyof T];
    
type FilteredType = Omit<MyInterface, ObjectKeys<MyInterface>>;
/* type FilteredType = {
    a: number;
    b: string;
    c: string;
} */

(如果您使用的是ESLint禁止型规则,并且它抱怨object,则应该重新配置它以不抱怨。(有在这方面.)

还请注意,如果您使用Omit根据某些类型函数筛选密钥,则可以通过键重映射在单个类型函数中进行筛选。

代码语言:javascript
复制
type OmitObjectKeys<T> = { [K in keyof T as T[K] extends object ? never : K]: T[K] }

type FilteredType2 = OmitObjectKeys<MyInterface>
/* type FilteredType2 = {
    a: number;
    b: string;
    c: string;
} */

操场链接到代码

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69526456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档