我有一种类型,FilteredType,它看起来像这样:
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‘这样的复杂对象属性。这有可能吗?
发布于 2021-10-11 13:08:14
如果你要颠倒你的逻辑,只保留“原始”值,它就会自行解决。请参阅KeysOfPrimitive,您可以进一步扩展它,只允许指定类型的KeysOfSpecified。
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[]>>;发布于 2021-10-11 13:53:48
数组是对象,因此可以使用类型进行筛选,这意味着“任何不是原语的东西”:
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根据某些类型函数筛选密钥,则可以通过键重映射在单个类型函数中进行筛选。
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;
} */https://stackoverflow.com/questions/69526456
复制相似问题